4 回答

TA貢獻1883條經驗 獲得超3個贊
let
也可用于避免閉包問題。它綁定了新的價值而不是保留舊的參考,如下面的例子所示。
for(var i = 1; i < 6; i++) { document.getElementById('my-element' + i) .addEventListener('click', function() { alert(i) })}
上面的代碼演示了一個典型的JavaScript閉包問題 對i
變量的引用存儲在單擊處理程序閉包中,而不是實際值i
。
每個單擊處理程序都將引用同一個對象,因為只有一個計數器對象可以容納6,因此每次單擊時會得到6個。
一般的解決方法是將它包裝在匿名函數中并i
作為參數傳遞。現在也可以通過使用let
替代var
方法來避免這些問題,如下面的代碼所示。
演示(在Chrome和Firefox 50中測試)
'use strict';for(let i = 1; i < 6; i++) { document.getElementById('my-element' + i) .addEventListener('click', function() { alert(i) })}

TA貢獻1802條經驗 獲得超4個贊
let
和之間有什么區別var
?
要了解其中的差異,請考慮以下代碼:
// i IS NOT known here
// j IS NOT known here
// k IS known here, but undefined
// l IS NOT known here
function loop(arr) {
// i IS known here, but undefined
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
for( var i = 0; i < arr.length; i++ ) {
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
};
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
for( let j = 0; j < arr.length; j++ ) {
// i IS known here, and has a value
// j IS known here, and has a value
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
};
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
}
loop([1,2,3,4]);
for( var k = 0; k < arr.length; k++ ) {
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here
};
for( let l = 0; l < arr.length; l++ ) {
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS known here, and has a value
};
loop([1,2,3,4]);
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here
在這里,我們可以看到我們的變量j只在第一個for循環中被知道,而不是在之前和之后。然而,我們的變量i在整個函數中是已知的。
另外,請考慮塊范圍變量在聲明之前是未知的,因為它們不會被提升。您也不允許在同一塊中重新聲明相同的塊范圍變量。這使得塊范圍變量比全局或功能范圍變量更不容易出錯,這些變量被提升并且在多個聲明的情況下不會產生任何錯誤。
let
今天使用安全嗎?
有些人會爭辯說,將來我們只會使用let語句,而var語句將會過時。JavaScript大師凱爾辛普森寫了一篇非常精細的文章,說明為什么他認為情況并非如此。
然而,今天絕對不是這樣。事實上,我們實際上需要問自己,使用該let
陳述是否安全。這個問題的答案取決于您的環境:
如果您正在編寫服務器端JavaScript代碼(Node.js),則可以安全地使用該
let
語句。如果您正在編寫客戶端JavaScript代碼并使用基于瀏覽器的轉換器(如Traceur或babel-standalone),則可以安全地使用該
let
語句,但是您的代碼在性能方面可能不是最優的。如果您正在編寫客戶端JavaScript代碼并使用基于節點的轉換器(如traceur shell腳本或Babel),則可以安全地使用該
let
語句。而且因為您的瀏覽器只會知道轉換后的代碼,所以應該限制性能缺陷。如果您正在編寫客戶端JavaScript代碼而不使用轉換器,則需要考慮瀏覽器支持。
仍然有一些瀏覽器根本不支持
let
:
如何跟蹤瀏覽器支持
有關let
在閱讀本答案時哪些瀏覽器支持該語句的最新概述,請參閱此Can I Use
頁面。
(*)全局和功能范圍的變量可以在聲明之前初始化和使用,因為JavaScript變量是懸掛的。這意味著聲明始終位于范圍的頂部。
(**)未提升塊范圍變量
添加回答
舉報