var i = 100; function addI(){ var i = 0; return function(){
i++; console.log(i);
}
}
addI()(); // 1
addI()(); // 1
var c = addI();
c(); // 1
c(); // 2今天遇到了这个面试问题,求科普下。为啥addI()()都为1(这点可以理解),而c()()执行i会递增?
3 回答
哔哔one
TA贡献1854条经验 获得超8个赞
有点汗颜啊,竟然没有把握——我的理解:add()()只是单纯的执行一次add方法,当给c对象引用add方法时,c对象一直存在(活引用),add方法中的方法形成了一个闭包(此时c对象引用的add方法已经形成了一个闭包)。第一次调用的时候,add方法内的i对象赋值为0,在执行匿名函数是,内部i没有值,找到外部的i,并++。第二次调用时,add方法再次申明了一个i对象,但是此时的内部匿名函数内i还保留着上一次调用的值。所以直接在上一次调用的结果i++。不知道对不对的
RISEBY
TA贡献1856条经验 获得超5个赞
addI() === addI() //false
每次运行生成的结果函数都不一样,各自引用各自闭包内的 i 值.
如果同一个函数运行,则会继续修改这个函数所属闭包内的 i 值.
添加回答
举报
0/150
提交
取消