如何将全局变量传递给util函数

时间:2016-03-15 19:55:22

标签: javascript jquery

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

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

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

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;
}

2 个答案:

答案 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