【问题标题】:How to pass global variable to a util function如何将全局变量传递给 util 函数
【发布时间】:2026-02-15 14:45:01
【问题描述】:

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

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

但问题是,如果我像在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;
}

【问题讨论】:

  • 这是不可能的。这是因为 javascript 总是按值传递,从不按引用传递。所以全局变量的值不会在作用域外改变。
  • 您可以结帐my answer to this question。在您的情况下,您需要传递一个字符串assignValueToVariable('xyz', data);,然后执行window[varName] = data。但正如我的回答中所述,不建议这样做......为什么不简单地xyz = data
  • 如果你真的想要全局变量,为什么不直接做 abc = data;xyz = data; 呢?这里没有太多可以抽象的东西。
  • @FelixKling 在我的实际用例中分配值不是一行代码。这些全局变量包含图表和数据表等对象。我不想让对象初始化的 10-15 行代码到处重复
  • @RKodakandla:然后有一个创建对象的函数:abc = createObjectFromData(data)xyz = createObjectFromData(data)

标签: javascript jquery


【解决方案1】:

当您调用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 中,原始类型(字符串、数字)是按值传递的(本质上是值被复制然后传递)。对象通过指向原始引用的副本传递,这有点古怪,与许多语言不同。

【讨论】:

  • “因为对象是通过引用传递的” 不,它们不是。对象被表示为 引用。这与传递 by 引用无关。这是一个常见的误解。按值传递和按引用传递是指如何评估绑定。这完全独立于那些绑定所持有的 value
  • 谢谢,我已经修正了这句话,因为它与我的代码示例没有太大关系。我认为我见过人们解释它的最常见的方式是“对象通过引用的副本传递”,这对我来说似乎是传达它们如何工作的好方法。
  • 是的。与任何其他值一样,引用会被复制。
【解决方案2】:

也许你可以使用这样的东西:

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

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

makeAjaxCall(setAbc);
// etc

【讨论】: