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高级教程》中关于函数表达式的部分
添加回答
举报