102
|
Afshin Mehrabani Mohd Jafar · 技术社区 · 11 年前 |
1
96
对于匿名函数表达式,函数为 匿名的 -从字面上看,它没有名字。指定给它的变量有一个名称,但函数没有。 (更新:ES5就是这样。从ES2015(又名ES6)开始,通常使用匿名表达式创建的函数会得到一个真名[但不是一个自动标识符],请继续阅读…) 名字很有用。可以在堆栈跟踪、调用堆栈、断点列表等中看到名称。名称是一件好事。 (你过去必须小心旧版本IE中的命名函数表达式[IE8及以下版本],因为它们在两个完全不同的时间错误地创建了两个完全独立的函数对象[更多信息请参阅我的博客文章 Double take ]. 如果您需要支持IE8[!!],那么最好使用匿名函数表达式或函数 声明 ,但要避免使用命名函数表达式。) 命名函数表达式的一个关键点是,它为函数体中的函数创建了一个具有该名称的作用域内标识符:
然而,截至ES2015,许多“匿名”函数表达式都会创建带有名称的函数,而这一点早于各种现代JavaScript引擎,它们在从上下文推断名称方面非常聪明。在ES2015中,您的匿名函数表达式会生成一个名为的函数
函数名称的赋值是用 SetFunctionName 规范中各种操作中使用的抽象操作。 短版本基本上是指当匿名函数表达式出现在赋值或初始化之类的东西的右侧时,比如:
(也可能是
或
(最后两个真的是一样的)
,生成的函数将有一个名称(
有一个重要且有意的异常:为现有对象的属性赋值:
这是因为在添加新功能的过程中,人们担心信息泄露;我对另一个问题的回答中的细节 here . |
2
26
如果函数需要引用自己(例如,对于递归调用),则命名函数很有用。事实上,如果您将一个文本函数表达式作为参数直接传递给另一个函数,那么该函数表达式 不能 在ES5严格模式中直接引用它自己,除非它被命名。 例如,考虑以下代码:
如果函数表达式传递给
从历史上看,即使使用匿名函数表达式,也可以通过利用
但是
(重点是我的) |
3
4
你应该 始终使用命名 函数表达式,这就是为什么:
例如,在这里,因为名称栏是在函数表达式中使用的,所以它不会在外部范围中声明。对于命名函数表达式,函数表达式的名称包含在其自身的范围内。 |
4
3
如果函数被指定为函数表达式,则可以为其指定一个名称。 它将仅在函数内部可用(IE8-除外)。
这个名称用于可靠的递归函数调用,即使它被写入另一个变量。
此外,NFE(命名函数表达式)名称可以用
注意:对于函数声明,这是不可能做到的。此“特殊”内部函数名称仅在函数表达式语法中指定。 |
5
1
当您希望能够引用有问题的函数而不必依赖于诸如
|
Softly · 单选按钮未按预期取值 1 年前 |
SlickRed · 我无法使用JS关注HTML元素 1 年前 |
assembler · Nextjs没有处理发布请求 1 年前 |
BADRUM · 执行两个获取功能后,如何导航回页面? 1 年前 |
Toniq · javascript为php保存多维数组 1 年前 |