繁体   English   中英

用一个函数在 JavaScript 中分配多个全局变量

[英]Assigning multiple global variables in JavaScript with one function

我已经环顾了一段时间,似乎无法找到这个问题的解决方案。

我在 JavaScript 中声明了三个全局变量,尚未分配,例如:

var GLOBAL_VARIABLE_ONE;
var GLOBAL_VARIALLE_TWO;
var GLOBAL_VARIABLE_THREE;

假设我有一个函数,我传递了两个参数,其中一个是 url 字符串,用于进行 ajax 调用以检索 JSON 对象,另一个是我想将返回的 JSON 分配给的全局变量。 因此,我有一个这样的功能:

function getBackList(urlName, globalVariable) {
    $.ajax({
    type: "GET",
    url: urlName,
    }).done(function (returned_data) {
        globalVariable = $.parseJSON(returned_data);
    });
}

我希望能够像这样调用函数:

getBackList("\some\url", GLOBAL_VARIABLE_ONE);

并将对象分配给全局。

现在,我意识到不推荐使用全局变量,并且我理解由于变量提升,传递给函数的参数是局部范围的。 但是,在分配这些全局变量后,我需要能够在其他函数中访问这些全局变量。

我的问题是如何传递全局变量并将它们分配给上面的一个函数,而不必创建单独的函数来显式分配每个函数(顺便说一下,这会产生很多代码冗余)?

function getBackList(urlName, globalVariableName) {
    $.ajax({
       type: "GET",
       url: urlName,
    }).done(function (returned_data) {
        window[globalVariableName] = $.parseJSON(returned_data);
    });
}

而是传入全局变量的名称 ^^^

全局变量实际上是window对象的成员。 所以你可以这样做:

function getBackList(x, variableName) {
  // .. stuff ..
  window[variableName] = $.parseJSON(returned_data);
}

getBackList(x, 'GLOBAL_VARIABLE_ONE');

Javascript 不允许这样做,因为它正在传递变量。

如果GLOBAL_VARIABLE_ONE是一个对象,它将传递一个引用。

例子:

a = {}

a现在引用新对象。

b = a;

b现在引用b引用的同一对象。 需要注意的是它不引用a

a = {}; b = a a = {}; b = a ,你得到

a
 \
  \
   { }
  /
 /
b

然后用a['one'] = {}你得到

a
 \
  \
   { one: { } }
  /
 /
b

为了实现您想要的,您需要GLOBAL_VARIABLE_ONE成为一个对象。

所以你可以这样做:

var GLOBAL_OBJECT = {};
getBackList("\some\url", GLOBAL_OBJECT['GLOBAL_VARIABLE_ONE']);

或者你可以这样做:

var GLOBAL_VARIABLE_ONE = {}
var GLOBAL_VARIALLE_TWO = {}
var GLOBAL_VARIABLE_THREE = {}

function getBackList(urlName, globalVariable) {
    $.ajax({
    type: "GET",
    url: urlName,
    }).done(function (returned_data) {
        globalVariable.json = $.parseJSON(returned_data);
    });
}

getBackList("\some\url", GLOBAL_VARIABLE_ONE);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM