最近在讀阮一峰老師的ES標準入門,讀到第一章的時候提到了一段程式碼
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
這裡用let就可以解決這個問題,但如果用ES5的方法呢? IIFE可以做到,不過是立即印製出來。
闭关修行中......
var a = []; for(var i = 0; i < 10; i++) { +function(i){ a[i] = function() { console.log(i); } }(i); }; a[6](); // 6
閉包問題
可以利用 自訂屬性var a = [];for (var i = 0; i
var a[i].n = i;//自定义一个属性 n a[i] = function () { console.log(this.n); };
}a[6](); // 6
這個不關let什麼事,我想提問者應該是想要輸出6吧?
let
但是你這提出來的問題,感覺和你想要的完全不搭邊啊,我想幫你改提問描述也有點無能為力啊…
這其實是閉包的問題,主要,我們先分析下為什麼會輸出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。
for
i
a[6]()
console.log(i)
至於提問者說的,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的結果。
可以採用閉包的方式http://www.softwhy.com/articl...這篇文章的後半部已經解釋了你的疑問
閉包問題
可以利用 自訂屬性
var a = [];
for (var i = 0; i
}
a[6](); // 6
這個不關
let
什麼事,我想提問者應該是想要輸出6吧?但是你這提出來的問題,感覺和你想要的完全不搭邊啊,我想幫你改提問描述也有點無能為力啊…
這其實是閉包的問題,主要,我們先分析下為什麼會輸出10:
for
裡面的i
的作用於是整個外部區域,所以,當調用a[6]()
的時候,其實運行的是console.log(i)
,而此時因為跑完循環,i
的值是10,所以輸出10。至於提問者說的,
let
可以解決,是因為,for
裡面,let
聲明的變量,作用於只在for
內部,所以,不會因為循環跑完而使得i
在全域作用域中為10。其實,這個問題真正考察的應該是閉包。
閉包的作用,類似於之前
let
的作用,是將局部的變數相互隔離開而不至於污染外部的變數值,每一個閉包內,都是一個獨立的區域,而閉包傳參只用於閉包內部使用,所以也可以實現輸出6的結果。可以採用閉包的方式
http://www.softwhy.com/articl...
這篇文章的後半部已經解釋了你的疑問