2014-07-08 138 views
-1

var用法是正確的聲明相同的變量名:在一個循環

$('li').each(function() 
{ 
    var item = $(this); 

    // ... 
}); 

var item; 

$('li').each(function() 
{ 
    item = $(this); 

    // ... 
}); 

都工作得不錯,甚至有'use strict'。這兩者之間有什麼根本區別嗎?

謝謝。

+2

兩者都是正確的,第二種方法'item'可以在循環外部訪問(這是區別) –

+4

@ raina77ow:不,它不是'for'循環,而是''每個'帶回調。 – Bergi

+0

變量的範圍。 –

回答

2

這取決於你想要的結果。在第一種情況下,變量在函數內聲明,這意味着它對於每次迭代/函數調用都是唯一的,並且不在循環/函數外部訪問。

第二種情況允許您訪問函數/循環之外的變量,它將包含最後一次迭代的值。

0

如果它是一個「正常循環」(即for),那麼你的代碼的第一個塊是技術上不正確的(從人類可讀性至少,至少,驚喜的角度來看)。

但是因爲你有一個帶回調的jQuery迭代函數,實際上是有區別。區別在於item的最後一個值將在第二個代碼塊的循環外可訪問,但在第一個塊中它將保留在閉包內。

0

有。

由於JavaScript中的變量是函數範圍的,所以第一種情況下,變量將只存在於迭代器中聲明的匿名函數中,並且將在每次運行時分配,每次運行時它將是一個新變量。

在第二種情況下的功能是有界的一些外部範圍,這將是恰好在每次迭代相同的變量,保持值,存儲在先前執行

詞「在每次迭代分配」聽起來可怕的,但基本上這不是問題,像V8這樣的JS引擎可以輕鬆地執行優化,這會將開銷降低到0.我會說這是推薦的變量聲明方式 - 將它們限制在最合理的範圍內。

說到第二種情況 - 因爲沒有東西會被破壞,所以通常是一個糟糕的設計實踐,因爲一些垃圾舊存儲的值可能會泄漏到其他某個上下文中,變量可能會被某些意外的繼續捕獲等。真正使用本地變量。