2010-11-02 152 views
31

我想在一個函數聲明多個變量:聲明多個變量在JavaScript

function foo() { 
    var src_arr  = new Array(); 
    var caption_arr = new Array(); 
    var fav_arr  = new Array(); 
    var hidden_arr = new Array(); 
} 

這是這樣做的正確方法?

var src_arr = caption_arr = fav_arr = hidden_arr = new Array(); 

回答

64

是的,這是,如果你希望它們都指向同一個對象在內存,但最有可能,你想他們是單獨的陣列,因此如果一個發生變異,其他人不影響。

如果你不希望它們都指向同一個對象,做

var one = [], two = []; 

[]是一個速記字面創建數組。

這裏的一個控制檯日誌指示差:

>> one = two = []; 
[] 
>> one.push(1) 
1 
>> one 
[1] 
>> two 
[1] 
>> one = [], two = []; 
[] 
>> one.push(1) 
1 
>> one 
[1] 
>> two 
[] 

在第一部分中,我定義onetwo以指向存儲器中的相同的對象/陣列。如果我使用.push方法,它會將1推入陣列,因此onetwo都有1。在第二個因爲我爲每個變量定義了獨特的數組,所以當我推到一個時,兩個不受影響。

+8

Bonuspoint不使用'' – DanMan 2010-11-02 22:18:18

+0

我有問題,新的Array(),符合市場預期。感謝您的解釋! – FFish 2010-11-02 22:24:18

+1

演示如何工作的獎勵;) – jcolebrand 2010-11-02 22:24:18

1

不,您的第二條語句將創建四個對同一個數組的引用。你想:

var src_arr  = [], 
    caption_arr = [], 
    fav_arr  = [], 
    hidden_arr = []; 
0

所有這些變量都會引用一個Array對象。

16

離開從該分配模式,即使您想讓所有變量指向同一個對象。

事實上,只有第一個將是一個變量聲明,其餘都只是分配到可能未申報的標識符

強烈建議將值指定給未聲明的標識符(又名未聲明的賦值),因爲如果在範圍鏈中找不到標識符,則會創建GLOBAL變量。例如:

function test() { 
    // We intend these to be local variables of 'test'. 
    var foo = bar = baz = xxx = 5; 
    typeof foo; // "number", while inside 'test'. 
} 
test(); 

// Testing in the global scope. test's variables no longer exist. 
typeof foo; // "undefined", As desired, but, 
typeof bar; // "number", BAD!, leaked to the global scope. 
typeof baz; // "number" 
typeof xxx; // "number" 

此外,ECMAScript第5嚴格模式不允許這種分配。 在嚴格模式下,對未聲明的標識符進行分配將導致TypeError異常,以防止隱含的全局變量。

相比之下,這裏就是我們看到的,如果正確寫入:

function test() { 
    // We correctly declare these to be local variables inside 'test'. 
    var foo, bar, baz, xxx; 
    foo = bar = baz = xxx = 5; 
} 
test(); 

// Testing in the global scope. test's variables no longer exist. 
typeof foo; // "undefined" 
typeof bar; // "undefined" 
typeof baz; // "undefined" 
typeof xxx; // "undefined" 
+0

mmm,所以最好的方法是:var one_arr = []; var two_arr = [];我想知道宣言和作業之間的區別。所以只宣佈第一個? – FFish 2010-11-02 22:39:19

+1

@FFish:在上面的例子中,'var'語句只用於'foo'標識符,其餘的賦值語句從*從右到左*計算,因爲賦值運算符的關聯性, (想象一下:var foo = value;其中'value'是具有多個賦值的表達式('bar = baz = xxx = 5'),它們與'var'語句無關。)但是,您可以使用逗號用一個'var'語句聲明多個變量:'var one_arr = [],two_arr = [],three_arr = [];' – CMS 2010-11-02 22:53:26