闭包直接调用外层函数和把函数赋值给变量再调用有啥区别?

function fn1(){
  var a = 6;
  function fn2(){
    alert(a) ;
  }
  return fn2;
}
// var f = fn1();
// f()  alert 6
fn1() //没有效果

如上代码,赋值给变量f能alert 6,但是直接调用fn1就没有反应。请问这是什么原理

阅读 3.2k
5 个回答

因为你fn1()只执行了1次。
而你的f 在赋值的时候执行了一次函数,然后f本身又执行了一次函数,相当于执行了2次。

因为return 是一个函数
所以 fn1() 得到一个函数
fn1()() 调用该函数

你仔细看看 fn1,直接 fn1是有结果的啊,结果就是返回了内部函数fn2:

var f = fn1(); // f 实际上等于 fn2
f() //  fn2()结果是 alert 6
// 这样结果就是 alert 6 了
fn1()()

你只是调用函数fn1 返回的是一个函数引用
在加一个()才是执行fn1()()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题