当函数作为参数传递时,Javascript函数提升不适用

Javascript function hoisting not applicable when the function is passed as an argument?

本文关键字:函数 Javascript 不适用 参数传递      更新时间:2023-09-26

Javascript有一个有趣的东西,叫做函数提升,这意味着我们可以在声明之前(即在视觉上)使用函数表达式(注意:我的措辞可能不正确,请随意评论)

fn1(); // works OK
function fn1() {console.log('fn1');}

但是,如果我们传递一个命名函数作为参数,函数提升就不会发生。语法看起来很相似,但我想这不再是一个函数表达式,而是一个命名的匿名函数(!)。

fn2(); // throws a ReferenceError as fn2 is not defined
setTimeout(function fn2() {console.log('fn2')}, 0);
  • 函数表达式和命名lambda之间确实有区别吗
  • 两者之间还有其他显著的区别吗
  • 考虑到fn2是一个命名的lambda,fn2名称是否可以从fn2本身以外的任何地方访问

只有函数语句/声明应该绑定相应的变量(并且要进行提升)。

setTimeout的参数列表中的函数被视为函数表达式;它有一个名称("fn2"),但没有绑定到变量fn2,并且不是在计算表达式之前创建的。。

考虑到fn2是一个命名的lambda,是否可以从fn2本身以外的任何地方访问fn2名称?

在IE的bug版本中,是的。命名函数表达式被创建为封闭执行上下文中的变量(这与ECMA-262不一致)。请参阅已解密的命名函数表达式