以下是示例:
setTimeout(function name(){console.log(1)}, 1000) (callback)
name()
(回调函数)被认为是函数声明还是命名函数表达式?
我知道函数声明可以被提升,而函数表达式则不行,但因为它在参数的上下文中,你如何确定是否可以提升它?
我不认为这是一个关于函数声明和函数表达式之间区别的重复问题。
我询问的是特定用例,即命名回调函数是函数声明还是函数表达式。我不认为这个用例在那个问题的答案中得到了涵盖。
以下是示例:
setTimeout(function name(){console.log(1)}, 1000) (callback)
name()
(回调函数)被认为是函数声明还是命名函数表达式?
我知道函数声明可以被提升,而函数表达式则不行,但因为它在参数的上下文中,你如何确定是否可以提升它?
我不认为这是一个关于函数声明和函数表达式之间区别的重复问题。
我询问的是特定用例,即命名回调函数是函数声明还是函数表达式。我不认为这个用例在那个问题的答案中得到了涵盖。
if
语句作为参数传递),因此function name() {...}
在你的示例中是一个表达式。
并且因为它是一个函数表达式,你可以省略名称。
5 + 5
是一个表达式,你可以像这样把5 + 5
放在一行中。5 + 5;
看起来我们可以在任何地方放置表达式。那么,鉴于此,JavaScript如何决定
function name() {
//...
}
<statement1>
<statement2>
<statement3>
...
有各种类型的语句, if
语句就是其中之一。还有一个概念是 ExpressionStatement
。正如其名称所示,它是由单个表达式组成的语句。这就是允许您在语句列表中放置 5 + 5;
的规则。
但是,这个解析规则是受限制的。它不能以关键字 function
(等等)开头。因此,当 JavaScript 遇到上述函数定义时,它不会将其解析为函数表达式,因为它无法将其解析为 ExpressionStatement
。唯一的选择是将其解析为一个函数 声明。
setTimeout(function name(){console.log(1)}, 1000)
由acorn提供。
(你应该查看实时版本,因为将鼠标悬停在AST上会突出显示相应的源文本,这使得理解更加容易)
是的,它是一个表达式。并且可以通过其名称从函数内部进行调用。
试一下这个:
setTimeout(function name(){
console.log(1);
console.log(name);
}, 1000)
不过要使用停止条件来调用它,否则你会耗尽堆栈。递归可能会带来麻烦...
function name() {}
返回了一些东西,对吧?它不返回一个函数吗?当然,实际上它将是一个对象,因为在JavaScript中函数是对象。该函数也会作为副作用被提升。 - Sidney