搜尋

首頁  >  問答  >  主體

javascript - ES6標準入門中let指令提到的for循環列印i是10,如果不用let怎麼替換?

最近在讀阮一峰老師的ES標準入門,讀到第一章的時候提到了一段程式碼

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

這裡用let就可以解決這個問題,但如果用ES5的方法呢? IIFE可以做到,不過是立即印製出來。

阿神阿神2829 天前942

全部回覆(4)我來回復

  • 扔个三星炸死你

    扔个三星炸死你2017-06-28 09:24:57

    var a = [];
                for(var i = 0; i < 10; i++) {
                    +function(i){
                        a[i] = function() {
                            console.log(i);
                        }
                    }(i);
                };
    a[6](); // 6

    閉包問題

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:24:57

    可以利用 自訂屬性
    var a = [];
    for (var i = 0; i < 10; i++) {

      var a[i].n = i;//自定义一个属性  n 
      a[i] = function () {
        console.log(this.n);
      };

    }
    a[6](); // 6

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-28 09:24:57

    這個不關let什麼事,我想提問者應該是想要輸出6吧?

    但是你這提出來的問題,感覺和你想要的完全不搭邊啊,我想幫你改提問描述也有點無能為力啊…

    這其實是閉包的問題,主要,我們先分析下為什麼會輸出10:

    var a = [];
    for(var i = 0; i < 10; i++) {
        a[i] = function () {
            console.log(i);
        };
    }
    a[6](); // 10

    for裡面的i的作用於是整個外部區域,所以,當調用a[6]()的時候,其實運行的是console.log(i),而此時因為跑完循環,i的值是10,所以輸出10。

    至於提問者說的,let可以解決,是因為,for裡面,let聲明的變量,作用於只在for內部,所以,不會因為循環跑完而使得i在全域作用域中為10。

    其實,這個問題真正考察的應該是閉包。

    var a = [];
    for(var i = 0; i < 10; i++) {
        (function() {
            [i] = function () {
                console.log(i);
            }
        })(i);
    }
    a[6]();

    閉包的作用,類似於之前let的作用,是將局部的變數相互隔離開而不至於污染外部的變數值,每一個閉包內,都是一個獨立的區域,而閉包傳參只用於閉包內部使用,所以也可以實現輸出6的結果。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-06-28 09:24:57

    可以採用閉包的方式
    http://www.softwhy.com/articl...
    這篇文章的後半部已經解釋了你的疑問

    回覆
    0
  • 取消回覆