为了账号安全,请及时绑定邮箱和手机立即绑定

js面试问题

js面试问题

千万里不及你 2018-09-10 12:03:11
  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 回答

?
qq_药药_0

TA贡献52条经验 获得超27个赞

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

查看完整回答
反对 回复 2018-09-11
?
哔哔one

TA贡献1854条经验 获得超8个赞

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

查看完整回答
反对 回复 2018-09-10
?
RISEBY

TA贡献1856条经验 获得超5个赞

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

每次运行生成的结果函数都不一样,各自引用各自闭包内的 i 值.
如果同一个函数运行,则会继续修改这个函数所属闭包内的 i 值.


查看完整回答
反对 回复 2018-09-10
  • 3 回答
  • 0 关注
  • 921 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信