0

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 本身之外,是否可以从其他任何地方访问该名称?
4

2 回答 2

1

只有函数语句/声明应该绑定一个相应的变量(并且受到提升)。

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

于 2014-11-05T02:15:39.263 回答
1

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

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

于 2014-11-05T02:57:29.663 回答