给出以下示例:
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
。剩下的唯一选择是将其解析为函数声明。
如果您对JavaScript程序的结构感到好奇,可以使用https://astexplorer.net(完整披露:我建立了此网站)来查看JavaScript解析器如何受欢迎。
例如,
setTimeout(function name(){console.log(1)}, 1000)
由橡子。
(不过,您实际上应该查看实时版本,因为将鼠标悬停在AST上会突出显示相应的源文本,这使事情更容易理解)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句