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

JS一道域和i++有关的问题,面试题,求帮忙

JS一道域和i++有关的问题,面试题,求帮忙

undertale 2017-03-16 21:47:36
这道题挺经典的相信很多人都做过了,正确答案是010。我很疑问第二个值为什么是1第一次运行f1输出0因为i是后加的,第二次运行f1,又重新赋值了var i=0啊,然后i又是后加的,所以应该输出0啊,为什么是1呢?
查看完整描述

2 回答

?
Caballarii

TA贡献1123条经验 获得超629个赞

f1实际上是Foo里return的那个函数,所以f1()只执行了console.log(i++),由于闭包的存在,两次f1()操作了同一个i,而f2()操作了另一个i

查看完整回答
1 反对 回复 2017-03-16
  • undertale
    undertale
    不好意思我太菜了,请问f1为啥是Foo的return函数?我以为f1=Foo f1(); 就是把Foo全部执行一遍
  • Franc_Ribery
    Franc_Ribery
    很明显把Foo()的执行结果赋值给了f1...函数的执行结果就是return的值,如果return没写的就是,所以这里f1就是Foo所返回的匿名函数,又因为这是一个闭包,你的闭包被变量f1所引用,所以这个闭包会一直存在直到f1变量被销毁,所以第二次执行的时候输出的就是1,因为闭包并没有被销毁,所以连同它所关联的i变量被一起保存了下来。。
  • Franc_Ribery
    Franc_Ribery
    很明显把Foo()的执行结果赋值给了f1...函数的执行结果就是return的值,如果return没写的就是,所以这里f1就是Foo所返回的匿名函数,又因为这是一个闭包,你的闭包被变量f1所引用,所以这个闭包会一直存在直到f1变量被销毁,所以第二次执行的时候输出的就是1,因为闭包并没有被销毁,所以连同它所关联的i变量被一起保存了下来。。
?
Franc_Ribery

TA贡献4条经验 获得超0个赞

很明显把Foo()的执行结果赋值给了f1...函数的执行结果就是return的值,如果return没写的就是,所以这里f1就是Foo所返回的匿名函数,又因为这是一个闭包,你的闭包被变量f1所引用,所以这个闭包会一直存在直到f1变量被销毁,所以第二次执行的时候输出的就是1,因为闭包并没有被销毁,所以连同它所关联的i变量被一起保存了下来。。

查看完整回答
反对 回复 2017-03-17
  • 2 回答
  • 1 关注
  • 1625 浏览
慕课专栏
更多

添加回答

举报

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