3 回答

TA貢獻1810條經驗 獲得超4個贊
quin著眼睛的答案不再是最新的。在ECMA 6規范中,指定的行為是
for(let i;;){}
i 在循環的每次迭代中獲取一個新的綁定。
這意味著每個閉包都捕獲一個不同的i實例。因此,截至目前的結果012是正確的結果。在Chrome v47 +中運行此程序時,您將獲得正確的結果。在IE11和Edge中運行它時,當前333似乎會產生不正確的結果()。
有關此錯誤/功能的更多信息,請參見本頁中的鏈接;
由于使用let表達式時,每次迭代都會創建一個新的詞匯作用域,該作用域鏈接到先前的作用域。這對于使用該let表達式有性能影響,在此處進行了報道。

TA貢獻1900條經驗 獲得超5個贊
恕我直言-最初實施此LET(產生初始版本的結果)的程序員在理智方面做得正確;他們可能沒有在實施過程中瀏覽過規格。
使用單個變量更有意義,但范圍僅限于for循環。特別是因為應該根據循環中的條件隨意更改該變量。
但是,等等-您可以更改循環變量。WTFJS ?。〉?,如果您嘗試在內部作用域中對其進行更改,則由于它是一個新變量,因此現在將無法使用。
我不喜歡要做的事情以獲得想要的東西(對于for是局部的單個變量):
{
let x = 0;
for (; x < length; x++)
{
things["fun" + x] = function() {
console.log(x);
};
}
}
在何處修改更直觀(如果是虛構的)版本以在每次迭代中處理新變量:
for (let x = 0; x < length; x++)
{
let y = x;
things["fun" + y] = function() {
console.log(y);
};
}
顯而易見,我對y變量的意圖是什么?;蛘呷绻鸖ANITY統治了宇宙,那將是我的意圖。
因此,您的第一個示例現在可以在FF中使用;它會產生0、1、2。您可以解決此問題。我稱這個問題為WTFJS。
ps。我對WTFJS的引用來自上面的JoeyTwiddle;這聽起來像是我今天之前應該知道的一個模因,但是今天是學習它的好時機。
添加回答
舉報