1 回答

TA貢獻1772條經驗 獲得超6個贊
這個和javascript的作用域以及作用域鏈有關。
當然想要徹底搞懂需要了解什么是執行環境,什么是活動對象。
舉個簡單的例子:(你可以試試下面,原理和你的一樣,簡化而已)
function getFunc(num){
var count = num;
return function(){
console.log(count++);
}
}
var func = getFunc(1);
func();// 1
func();// 2
func();// 3
func();// 4
一個函數在調用的時候,會專揀一個執行環境,并且會創建相應的作用域鏈
getFunc() 調用的時候創建了一個執行環境,并且有一個作用域鏈,然后參數(arguments)會初始化函數的活動對象。
同時getFunc()返回了一個匿名函數,賦值給了func();
func()在調用匿名函數的時候,也會創建一個執行環境也有一個作用域鏈,在func()的作用域鏈中,getFunc()屬于func()的外部函數,因此外部函數的活動對象處在作用域鏈的第二位,然后依次類推,直到全局執行環境。
所以,在func()中使用了 count 變量,但是本身這個函數是沒有的,所以需要沿著作用域鏈繼續往上查找,直到找到位置,在他外部函數中發現了count,所以使用并且重新賦值。
這個過程,每執行一次func(),對count進行了重新賦值 count++,下一次 func() 會繼續找 getFunc() 中的count,這個count就上一個func()給改變了。
如果想更加細致的了解,可以閱讀《javascript高級教程》中關于函數表達式的部分
添加回答
舉報