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

关于js闭包

关于js闭包

咩咩咩3124927 2016-09-24 17:24:01
<!DOCTYPE html> <html> <head>   <meta charset="utf-8">   <title>JS Bin</title> </head> <body> <script>     function f1(){     var n=999;     function f2(){       alert(n);     }     return f2;   }   var result=f1();   result(); </script> </body> </html>这是一个js的闭包问题,但是我看不懂最后两部为什么输出f1函数的时候为什么要声明变量result,而且最后result后面还有括号,他们之间是什么逻辑关系呢?
查看完整描述

1 回答

已采纳
?
千秋此意

TA贡献158条经验 获得超187个赞


f1()通过return暴露出一个公有的函数f2出去,在f2函数里引用了变量n,因为f2实际上是定义在f1内部的所以当f2的作用域里找不到变量n的时候会沿着作用域链往上找到f1作用域里的变量n,只要f2里对n的引用还在即使f1已经运行完毕但是里面的变量n也不会被销毁(垃圾回收);

// 至于为什么result要调用,代码这样写就比较直观:
function f1() {
  var n=999;
  return function(){
    console.log(n);
  }
}
var result = f1(); // 这一步f1()返回的实际上就是本来的f2那个函数,所以要在下面再调用f2才能执行里面的代码。
result();
// 直接写 f1()()也可以的


查看完整回答
反对 回复 2016-09-24
  • 咩咩咩3124927
    咩咩咩3124927
    function f1(){     var n=999;     function f2(){       alert(n);     }     return f2();   } f1(); 你好,我再问下,我这样直接在后面调用f1();也可以输出结果,请问跟申明变量reuslt然后再调用输出有什么区别吗?
  • 千秋此意
    千秋此意
    有区别的,如果按你这样写,最后f2里面的代码“alert(n)”还是执行了,不过他执行的时间是在你调用f1()的时候就执行了,你f1里面的return返回的值其实是undefined,而原来那个写法f1调用返回的值是f2这个函数体,所以两种写法虽然都可以让f2里面的代码执行但是执行的过程是不一样的,f1的返回值也不同
  • 咩咩咩3124927
    咩咩咩3124927
    多谢了
  • 1 回答
  • 1 关注
  • 1150 浏览
慕课专栏
更多

添加回答

举报

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