2016-03-06 197 views
0

我有4個函數:function1,function2,function3,function4javascript:將多個變量存儲在一個數組中

現在,正在計算每個前3個函數中的值。我想將這3個值存儲在全局數組中,並在第4個函數中使用它。

以下方法是否正確?

var array1=[] 

function1(){ 
array1[0]=calculated value1; 
} 

function2(){ 
array1[1]=calculated value2; 
} 

function3(){ 
array1[2]=calculated value3; 
} 

這個數組將在第4個函數中使用。

+0

你有任何問題,或者你只是在尋求一個更好的* *方式做的東西? –

+0

當!我很抱歉 !! 是的。所以我想確認我的方法是否正確。 以及如果有更好的方法呢? – Cerberus

回答

1

不,我不會推薦這樣做。

更新: 根據您作爲另一個答案的評論而寫的信息,我猜測您的不同功能用於根據用戶輸入計算某些值。

如果你真的想緩存一個全局變量的值,我仍然會建議你使用一個名爲成員的對象,因爲在閱讀和試圖理解代碼時它通常比數字索引更有意義:

var myGlobalObject={}; 

function one(){ 
    myGlobalObject.nameOfValueOne = calculated value1; 
} 

如果你需要它,當您繪製一個數組,你可以創建數組:

myPlotFunction([ myGlobalObject.nameOfValueOne, myGlobalObject.nameOfValueTwo]); 

但是,如果它沒有意義的名字的值,比如,如果用戶可以添加可變數量的值,那麼你應該使用一個數組,並可能使用myArray.push(value)

+0

他的功能不返回任何東西! –

+0

生成的數組正被用作在d3中創建條形圖的數據集。 在這種情況下,我將無法使用對象。 它必須在一個數組中。 – Cerberus

+0

@Reddy我知道僞代碼沒有返回語句。塞伯魯斯甚至沒有寫出應該增加結果。我想知道爲什麼最常用的方法不被使用。 – some

1

不要使用全局變量,除非它非常非常必要,而且如果您真的想要使用它,請嘗試使用閉包來確保您不會填充全局範圍,同時爲了使您的變量和函數保密,其他具有相同名稱的全局變量和函數不會相互影響。

嘗試在閉包中包裝現有的代碼。通過這種方式,我認爲你現有的代碼並不糟糕。而且你的全局變量在閉包模塊中是全局變量。

(function($){ 
    //.. your existing code. 
})(jQuery) 

注:所有的變量和函數都可以在只封閉塊。

+1

這聽起來不錯! 我沒有想過這個。 謝謝。 :) – Cerberus

+0

什麼jQuery與此做什麼? – some

+0

既然他說過d3圖表,他肯定會使用jquery。 :) –

1

因爲函數是JavaScript中第一類對象,你可能會做一些哈克這樣的東西

var i = 0; 
var fa = function() { 
    fa.result = "result_" + i; 
    i += 1; 
}; 

console.log(fa.result); // prints undefined 

// now call fa 
fa(); 

console.log(fa.result); // prints result_0 


// now call fa again 
fa(); 

console.log(fa.result); // prints result_1 

所以,現在它自己的最後結果,你可能會在其他功能使用的每個功能的商店。

0

這裏是關係到你的D3.js場景另一個答案,享受

// create a datastructure to hold your array like this 
var ArrayHolder = function() { 
    var _array = [null, null, null]; 
    var __nameIndexMap__ = { 
    "A": 0, 
    "B": 1, 
    "C": 2 
    }; 
    Object.defineProperty(this, 'setData', { 
    value: function(name, value) { 
     var index = __nameIndexMap__[name]; 
     if (index >= 0) { 
     _array[index] = value; 
     } 
    } 
    }); 
    Object.defineProperty(this, 'array', { 
    get: function() { 
     return _array; 
    } 
    }); 
}; 

var myArray = new ArrayHolder(); 


console.log(myArray.array); // prints [null, null, null] 

var i = 0; 

function a() { 
    // provide each function a name 
    var __name__ = "A"; 
    myArray.setData(__name__, i++); 
} 

a(); 

console.log(myArray.array); // prints [0, null, null] 

function b() { 
    var __name__ = "B"; 
    myArray.setData(__name__, i++); 
} 

b(); 

console.log(myArray.array); // prints [0, 1, null] 

function c() { 
    var __name__ = "C"; 
    myArray.setData(__name__, i++); 
} 

c(); 
console.log(myArray.array); // prints [0, 1, 2] 


a(); 
console.log(myArray.array); // prints [3, 1, 2]