function count() {
var arr = [];
for (var i=1; i<=3; i++) { // var
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
alert(f1()); // 16
alert(f2()); // 16
alert(f3()); // 16為什么改成let后,輸出變了?
function count() {
var arr = [];
for (let i=1; i<=3; i++) { //let
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
alert(f1()); // 1
alert(f2()); // 4
alert(f3()); // 9不用再贅述var和let作用域的不同。我知道var對整個count函式有效,let只對for回圈有效。
我看到的此題對于var回傳的i都是4的解釋是“回傳的函式參考了變數i,但它并非立刻執行。等到3個函式都回傳時,它們所參考的變數i已經變成了4”。我的疑問是,用了let,怎么就“立刻執行”并且回傳的i=1,2,3了呢?
uj5u.com熱心網友回復:
用 let 宣告的是塊作用域變數,當在for中使用let時每次回圈都會在回圈體的塊作用域內創建一個新的i變數,每次回圈體塊作用域都會與塊作用域內創建的function函式進行關聯,形成“閉包”,
閉包可以讓每次塊作用域和其內的i變數保留,不會被系統回收。
當這個函式被呼叫時會從創建函式時所在的塊作用域內取那個被保留的i變數。
uj5u.com熱心網友回復:
謝謝。
可以解釋下var這個例子嗎,為什么“并非立刻執行”直到i變成4才開始執行i*i呢?
uj5u.com熱心網友回復:
var宣告的i始終只有一個。你在回圈中創建了3個函式。但呼叫函式是在回圈之后,回圈已經結束了,i的值已經是回圈最大值加1了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/247582.html
標籤:JavaScript
上一篇:想要用video.js實作視頻播放的功能,它能不能支持wmv格式的啊?
下一篇:誰會,幫下
