鍍金池/ 問(wèn)答/HTML/ js面試問(wèn)題

js面試問(wèn)題

    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

今天遇到了這個(gè)面試問(wèn)題,求科普下。
為啥addI()()都為1(這點(diǎn)可以理解),而c()()執(zhí)行i會(huì)遞增?

回答
編輯回答
神經(jīng)質(zhì)

addI() === addI() //false

每次運(yùn)行生成的結(jié)果函數(shù)都不一樣,各自引用各自閉包內(nèi)的 i 值.
如果同一個(gè)函數(shù)運(yùn)行,則會(huì)繼續(xù)修改這個(gè)函數(shù)所屬閉包內(nèi)的 i 值.

2017年2月26日 00:04
編輯回答
離觴

有點(diǎn)汗顏啊,竟然沒(méi)有把握——我的理解:add()()只是單純的執(zhí)行一次add方法,當(dāng)給c對(duì)象引用add方法時(shí),c對(duì)象一直存在(活引用),add方法中的方法形成了一個(gè)閉包(此時(shí)c對(duì)象引用的add方法已經(jīng)形成了一個(gè)閉包)。第一次調(diào)用的時(shí)候,add方法內(nèi)的i對(duì)象賦值為0,在執(zhí)行匿名函數(shù)是,內(nèi)部i沒(méi)有值,找到外部的i,并++。第二次調(diào)用時(shí),add方法再次申明了一個(gè)i對(duì)象,但是此時(shí)的內(nèi)部匿名函數(shù)內(nèi)i還保留著上一次調(diào)用的值。所以直接在上一次調(diào)用的結(jié)果i++。不知道對(duì)不對(duì)的

2017年6月29日 04:42