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

时间:2014-11-05 02:05:05

标签: javascript function hoisting

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本身以外的任何地方访问?

2 个答案:

答案 0 :(得分:1)

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

setTimeout的参数列表中的函数被视为函数 expression ;它有一个名称(“fn2”)但是绑定到变量fn2并且在评估表达式之前是而不是 ..

答案 1 :(得分:1)

  

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

在IE的错误版本中,是的。命名函数表达式在封闭执行上下文中创建为变量(与ECMA-262不一致)。请参阅Named function expressions demystified