我想知道是否可以将JavaScript中的全局变量按名称传递给函数?
在我的用例中,我有两个全局变量abc
和xyz
。调用function1()
时,我会进行AJAX调用,并希望将响应用于某些工作并将值赋给变量abc
。 function2()
和变量xyz
也存在相同的功能。所以我想提取这个assignValueToVariable()
函数并使其成为一个util方法。
但问题是,如果我像function2()
那样传递全局变量名,那么全局范围内的xyz
总是未定义的。我如何才能完成这项工作,以便在assignValueToVariable()
和function1()
中使用相同的function2()
方法?
<button type="button" onclick="otherfunction();">Click Me</button>
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 :(得分:2)
当您致电assignValueToVariable(xyz, data);
时,您没有传递变量名称&#34; xyz&#34;,您正在传递存储在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中,原始类型(字符串,数字)按值传递(实际上该值被复制然后传递)。对象通过指向原始的引用的副本传递,这有点古怪并且与许多语言不同。
答案 1 :(得分:0)
也许你可以使用这样的东西:
function assignValueToVariable(globalObj, someKey) {
return function (retVal) {
globalObj[someKey] = retVal;
};
}
var setAbc = assignValueToVariable(window, 'abc'),
setXyz = assignValueToVariable(window, 'xyz');
makeAjaxCall(setAbc);
// etc