哪var
用法是正確的聲明相同的變量名:在一個循環
$('li').each(function()
{
var item = $(this);
// ...
});
或
var item;
$('li').each(function()
{
item = $(this);
// ...
});
都工作得不錯,甚至有'use strict'
。這兩者之間有什麼根本區別嗎?
謝謝。
哪var
用法是正確的聲明相同的變量名:在一個循環
$('li').each(function()
{
var item = $(this);
// ...
});
或
var item;
$('li').each(function()
{
item = $(this);
// ...
});
都工作得不錯,甚至有'use strict'
。這兩者之間有什麼根本區別嗎?
謝謝。
從長遠來看,這樣的優化可能並不重要。
請在下面簽了JSPerf:
http://jsperf.com/declaring-variables-inside-loops/4 http://jsperf.com/declaring-variables-inside-loops/11
似乎仍有爭論回事:P
這取決於你想要的結果。在第一種情況下,變量在函數內聲明,這意味着它對於每次迭代/函數調用都是唯一的,並且不在循環/函數外部訪問。
第二種情況允許您訪問函數/循環之外的變量,它將包含最後一次迭代的值。
如果它是一個「正常循環」(即for
),那麼你的代碼的第一個塊是技術上不正確的(從人類可讀性至少,至少,驚喜的角度來看)。
但是因爲你有一個帶回調的jQuery迭代函數,實際上是有區別。區別在於item
的最後一個值將在第二個代碼塊的循環外可訪問,但在第一個塊中它將保留在閉包內。
有。
由於JavaScript中的變量是函數範圍的,所以第一種情況下,變量將只存在於迭代器中聲明的匿名函數中,並且將在每次運行時分配,每次運行時它將是一個新變量。
在第二種情況下的功能是有界的一些外部範圍,這將是恰好在每次迭代相同的變量,保持值,存儲在先前執行
詞「在每次迭代分配」聽起來可怕的,但基本上這不是問題,像V8這樣的JS引擎可以輕鬆地執行優化,這會將開銷降低到0.我會說這是推薦的變量聲明方式 - 將它們限制在最合理的範圍內。
說到第二種情況 - 因爲沒有東西會被破壞,所以通常是一個糟糕的設計實踐,因爲一些垃圾舊存儲的值可能會泄漏到其他某個上下文中,變量可能會被某些意外的繼續捕獲等。真正使用本地變量。
兩者都是正確的,第二種方法'item'可以在循環外部訪問(這是區別) –
@ raina77ow:不,它不是'for'循環,而是''每個'帶回調。 – Bergi
變量的範圍。 –