被命名为回调函数的表达式吗?

12

给出以下示例:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式命名为Capture Group的替代方案,前导$字符

意外的函数表达式。(首选箭头回调)

意外的函数表达式首选箭头回调

无效使用void表达式回调函数

TIBCO Spotfire 表达式:如何将一组嵌套列重命名为新名称

我应该命名为validate函数throwExceptionIf ...吗?

回调Lambda表达式+ JavaFX

匿名函数表达式和命名函数表达式(JavaScript)之间有区别吗?

正则表达式-将文件重命名为文件名中的最高分辨率

正则表达式将文件夹从“ dd.mm.yy”重命名为“ yy.mm.dd”?

将带有电影名称的字幕从movie_name 列表重命名为subtitles_list 而不使用正则表达式

命名为bash函数的参数

单个函数类(命名为动词)

Swift:尝试将元组传递给回调函数时出现“歧义表达式”

(非回调)函数表达式是否必须分配给变量?

将表达式传递给函数时,on.exit()回调已删除

Lambda表达式作为参数用作AsTask()回调

命名为MaterialPageRoute?

被命名为管道(mkfifo)是RabbitMQ的前身吗?

我可以在python中将变量命名为“ now”吗?

Elixir将导入的函数重命名为别名

Swift协议多个匹配函数命名为error

打字稿命名函数表达式

Kotlin:嵌套未命名函数中的此表达式

调用命名函数表达式

构造函数也可以称为函数表达式吗?

以Lisp命名为lambda

所有函数都在IIFE表达式内吗?

如何在php中将正则表达式参数传递给preg replace回调?