js面试问题

  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会递增?


千万里不及你
浏览 949回答 3
3回答

qq_药药_0

第一个每次都从新var定义了一次,第二个没有从新定义。

哔哔one

有点汗颜啊,竟然没有把握——我的理解:add()()只是单纯的执行一次add方法,当给c对象引用add方法时,c对象一直存在(活引用),add方法中的方法形成了一个闭包(此时c对象引用的add方法已经形成了一个闭包)。第一次调用的时候,add方法内的i对象赋值为0,在执行匿名函数是,内部i没有值,找到外部的i,并++。第二次调用时,add方法再次申明了一个i对象,但是此时的内部匿名函数内i还保留着上一次调用的值。所以直接在上一次调用的结果i++。不知道对不对的

RISEBY

addI() === addI() //false每次运行生成的结果函数都不一样,各自引用各自闭包内的 i 值.如果同一个函数运行,则会继续修改这个函数所属闭包内的 i 值.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript