makeCounter這個函式,為什么直接呼叫它,回傳都是0。
而把它賦值給一個變數y,卻回傳0、1、2,起到了計數的作用?
就賦值這一個動作,能改變函式的回傳值?
function makeCounter(){
let count=0;
return function(){
return count++;
};
}
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
賦值給變數y:
let y=makeCounter();
alert(y()); //0
alert(y()); //1
alert(y()); //2
uj5u.com熱心網友回復:
這個認真的講是閉包原理,每呼叫一次makeCounter()都產生一個閉包環境。
在每個閉包環境中都創建一個獨立的 count 變數
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
alert(makeCounter()()); // 0
這樣是呼叫3次makeCounter()。就創建了3個 count 變數
makeCounter()之后的()是呼叫回傳的function(){return count++;}函式,
函式中操作的count是函式所在閉包環境中 count 變數。
每個函式中操作的count都是不同閉包環境中 count 變數。
也就類似于下面這樣
if (true) {
let count=0;
alert(count++);
}
if (true) {
let count=0;
alert(count++);
}
if (true) {
let count=0;
alert(count++);
}
賦值給變數y:
let y=makeCounter();
alert(y()); //0
alert(y()); //1
alert(y()); //2
是只呼叫1次makeCounter()。只創建1個 count 變數
把回傳的function(){return count++;}函式賦值給y,
3次呼叫y函式中操作的count變數都是同一個。
也就類似于下面這樣
if (true) {
let count=0;
alert(count++);
alert(count++);
alert(count++);
}
uj5u.com熱心網友回復:
還在理解你的內容,先感謝你的詳細解答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/245476.html
標籤:JavaScript
下一篇:如何使用Axcure的元件?
