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()()執(zhí)行i會遞增?
1 回答

蠱毒傳說
TA貢獻1895條經(jīng)驗 獲得超3個贊
有點汗顏啊,竟然沒有把握——我的理解:add()()只是單純的執(zhí)行一次add方法,當給c對象引用add方法時,c對象一直存在(活引用),add方法中的方法形成了一個閉包(此時c對象引用的add方法已經(jīng)形成了一個閉包)。第一次調(diào)用的時候,add方法內(nèi)的i對象賦值為0,在執(zhí)行匿名函數(shù)是,內(nèi)部i沒有值,找到外部的i,并++。第二次調(diào)用時,add方法再次申明了一個i對象,但是此時的內(nèi)部匿名函數(shù)內(nèi)i還保留著上一次調(diào)用的值。所以直接在上一次調(diào)用的結(jié)果i++。不知道對不對的
添加回答
舉報
0/150
提交
取消