3 回答

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

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