亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

for循環中的let關鍵字

for循環中的let關鍵字

慕哥9229398 2019-11-13 14:59:35
ECMAScript 6 let應該提供塊范圍,而不會引起麻煩。有人可以解釋為什么在i函數下面的代碼中,解析為循環中的最后一個值(與一樣var),而不是當前迭代中的值嗎?"use strict";var things = {};for (let i = 0; i < 3; i++) {    things["fun" + i] = function() {        console.log(i);    };}things["fun0"](); // prints 3things["fun1"](); // prints 3things["fun2"](); // prints 3根據MDNlet在這樣的for循環中使用,應該將變量綁定在循環主體的范圍內。當我在塊中使用臨時變量時,事情按預期運行。為什么有必要?"use strict";var things = {};for (let i = 0; i < 3; i++) {    let index = i;    things["fun" + i] = function() {        console.log(index);    };}things["fun0"](); // prints 0things["fun1"](); // prints 1things["fun2"](); // prints 2我使用Traceur和來測試了腳本node --harmony。
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

quin著眼睛的答案不再是最新的。在ECMA 6規范中,指定的行為是


for(let i;;){}

i 在循環的每次迭代中獲取一個新的綁定。


這意味著每個閉包都捕獲一個不同的i實例。因此,截至目前的結果012是正確的結果。在Chrome v47 +中運行此程序時,您將獲得正確的結果。在IE11和Edge中運行它時,當前333似乎會產生不正確的結果()。


有關此錯誤/功能的更多信息,請參見本頁中的鏈接;


由于使用let表達式時,每次迭代都會創建一個新的詞匯作用域,該作用域鏈接到先前的作用域。這對于使用該let表達式有性能影響,在此處進行了報道。


查看完整回答
反對 回復 2019-11-13
?
梵蒂岡之花

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;這聽起來像是我今天之前應該知道的一個模因,但是今天是學習它的好時機。


查看完整回答
反對 回復 2019-11-13
  • 3 回答
  • 0 關注
  • 760 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號