簡體   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