2016-03-15 77 views
0

我想知道是否可以通过名称将JavaScript中的全局变量传递给函数?如何将全局变量传递给util函数

在我的使用案例中,我有两个全局变量abcxyz。当调用function1()时,我会进行一次AJAX调用,并希望将该响应用于某些工作并将值赋予变量abcfunction2()和变量xyz存在相同的功能。所以我想提取这个assignValueToVariable()函数,并使其成为一种实用方法。

但问题是,如果我像function2()那样传递全局变量名,那么全局范围内的xyz总是未定义的。我该如何做这项工作,以便我可以在function1()function2()中使用相同的assignValueToVariable()方法?

HTML

<button type="button" onclick="otherfunction();">Click Me</button> 

的JavaScript

var abc, 
    xyz; 

function1(); 
function2(); 

function function1() { 
    //ajax call - get data and pass it to function 
    data = "123"; 
    // this works. Since I'm directly refering global variable in the function 
    assignValueToVariableABC(data); 
} 

function function2() { 
    //ajax call - get data; 
    data = "456"; 
    // this doesn't set the value to global variable 
    assignValueToVariable(xyz, data); 
} 

function otherfunction() { 
    //xyz is undefined here 
    console.log(abc + "--" + xyz); 
} 

function assignValueToVariable(varName, data) { 
    //assign value from data to variable 
    varName = data; 
} 

function assignValueToVariableABC() { 
    //assign value from data to variable 
    abc = data; 
} 
+0

这是不可能的。这是因为JavaScript总是按价值传递,而不是通过引用传递。所以全局变量的值不会超出范围。 – DinoMyte

+0

您可以结帐[我对这个问题的回答](http://stackoverflow.com/a/26020014/2324107)。在你的情况下,你需要传递一个字符串'assignValueToVariable('xyz',data);'然后做'window [varName] = data'。但正如我的答案所述,它不被推荐......为什么不简单地'xyz = data'? –

+2

如果你真的想要全局变量,为什么不只是'abc = data;'和'xyz = data;'?这里没有太多可以抽象的东西。 –

回答

2

当你调用assignValueToVariable(xyz, data);你是不是传递变量名 “XYZ” ,您正在通过即存储在xyz,当你有简单的类型如字符串和数字。这就是为什么给varName赋值并不会在该函数之外改变它的原因,它本质上是一个副本。

你可以存储在一个对象的全局数据,因为这样你可以在一个字符串传递给被用作关键字:

var globalobject = { 
    "xyz": "foo", 
    "abc": "bar" 
}; 

function function2() { 
    assignValueToGlobal("xyz", 123); 
} 

function assignValueToGlobal(varName, data) 
{ 
    globalobject[varName] = data; 
} 

function2(); 
console.log(globalobject); 

为了进一步澄清,在JavaScript的基本类型(字符串,数字)是按值传递(实质上,该值被复制并传递)。对象通过指向原始对象的引用副本传递,这有点古怪,与许多语言不同。

+0

*“因为对象是通过引用传递的”*否,它们不是。对象被表示为**引用。这与通过**参考无关。这是一种常见的误解。按值传递并按引用传递是指如何评估绑定。这完全独立于那些绑定拥有的*值*。 –

+0

谢谢,我已经修复了这句话,因为它与我的代码示例没有多大关系。我认为我看过的人最常用的解释方式是“对象通过引用副本传递”,这对我来说似乎是传达它们工作方式的好方法。 – Sentri

+0

是的。与其他值一样,引用也被复制。 –

0

也许你可以使用这样的事情:

function assignValueToVariable(globalObj, someKey) { 
    return function (retVal) { 
     globalObj[someKey] = retVal; 
    }; 
} 

var setAbc = assignValueToVariable(window, 'abc'), 
    setXyz = assignValueToVariable(window, 'xyz'); 

makeAjaxCall(setAbc); 
// etc