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);
fn2
名称是否可以从fn2本身以外的任何地方访问?答案 0 :(得分:1)
只有函数语句/声明应绑定相应的变量(并且需要提升)。
setTimeout的参数列表中的函数被视为函数 expression ;它有一个名称(“fn2”)但是不绑定到变量fn2
并且在评估表达式之前是而不是 ..
答案 1 :(得分:1)
考虑到fn2是一个名为lambda的fn2名称,是否可以从fn2本身以外的任何地方访问?
在IE的错误版本中,是的。命名函数表达式在封闭执行上下文中创建为变量(与ECMA-262不一致)。请参阅Named function expressions demystified。