iT邦幫忙

1

新手請教閉包相關問題

function counter(){
var count = 0;

function innerCounter(){
return ++count;
}

return innerCounter;
}

var countFunc = counter();

console.log( counter()());//1
console.log( counter()());//1
console.log( counter()());//1
console.log( countFunc() ); //1
console.log( countFunc() ); //2
console.log( countFunc() ); //3

請問這種寫法counter()()為什麼無法順利得到1/2/3?
經過的途徑感覺是相同的,想了一晚也得不出答案...麻煩各路大神幫幫忙

看更多先前的討論...收起先前的討論...
bill iT邦新手 5 級 ‧ 2021-10-13 16:40:28 檢舉
應該是每次呼叫counter()的時候count都會重新宣告=0,故return都是 0+1=1。
試試把var count = 0;放到function counter()之前吧
bill0704 iT邦新手 5 級 ‧ 2021-10-14 08:09:20 檢舉
可以查一個關鍵字 curry function,前者沒有綁定變數,所以執行完就被消滅了,後者最後return 的是function 且被綁定在countFunc中
bill0704 iT邦新手 5 級 ‧ 2021-10-14 08:09:20 檢舉
可以查一個關鍵字 curry function,前者沒有綁定變數,所以執行完就被消滅了,後者最後return 的是function 且被綁定在countFunc中
freshjs iT邦新手 5 級 ‧ 2021-10-15 16:12:59 檢舉
我去查了curry function.很有幫助,謝謝您!

2 個回答

1
jason71708
iT邦新手 5 級 ‧ 2021-10-15 15:29:01
最佳解答
counter() // 得到一個全新的計時器
counter()() // 得到一個全新的計時器並執行一次
countFunc = counter(); // 得到一個全新的計時器存在 countFunc 變數內
countFunc() // countFunc 變數內存的計時器執行一次

一個是沒存起來,每次都是建新的並執行
一個是有存起來,每次都是用同一個計時器執行

freshjs iT邦新手 5 級 ‧ 2021-10-15 16:12:30 檢舉

簡單好懂,謝謝您!

Luke iT邦新手 2 級 ‧ 2021-10-16 11:28:02 檢舉

/images/emoticon/emoticon07.gif

2

第一種跑法counter()(),是單獨重新運行。
每一次RUN都會重新RUN, 並受到var count = 0;重新給值。

但你二種跑法countFunc()。則是繼承運行了。
畢竟已經將運行及繼承性存在變數內了。
也就是說在其函式中的 count 值會被記錄住。
如果說用PHP來說明的話。它已經是CLASS的觀念做法了。

freshjs iT邦新手 5 級 ‧ 2021-10-15 16:11:53 檢舉

謝謝您!

我要發表回答

立即登入回答