当前位置: 首页 > 面试题库 >

JavaScript为什么要使用命名函数表达式?

郁明诚
2023-03-14
问题内容

我们可以通过两种不同的方式在JavaScript中执行函数表达式:

命名函数表达式(NFE)

var boo = function boo () {
  alert(1);
};

匿名函数表达式

var boo = function () {
  alert(1);
};

而且两个都可以用调用boo();。我真的看不到为什么/何时应该使用匿名函数以及何时应该使用命名函数表达式。他们之间有什么区别?


问题答案:

对于匿名函数表达式,该函数是匿名的从字面上看,它没有名称。您要为其分配变量的变量具有名称,但是该函数没有。
_(更新:这在ES5中是正确的。从ES2015[akaES6]开始,通常使用匿名表达式创建的函数会获得真实名称[但不是自动标识符],请继续阅读…)

名称很有用。可以在堆栈跟踪,调用堆栈,断点列表等中看到名称。名称是Good Thing™。

(您以前必须提防IE[IE8及以下版本的IE较旧版本中的命名函数表达式,因为它们在两个完全不同的时间错误地创建了两个完全独立的函数对象中的更多内容。)支持IE8[!!],最好使用匿名函数表达式或函数声明,但要避免使用命名函数表达式。)

关于命名函数表达式的关键一件事是,它在函数体中为函数创建了一个范围内的标识符:

var x = function example() {

    console.log(typeof example); // "function"

};

x();

console.log(typeof example);     // "undefined"

不过,从ES2015开始,许多“匿名”函数表达式会创建带有名称的函数,而这要早于各种现代JavaScript引擎,它们非常聪明地从上下文推断名称。在ES2015中,您的匿名函数表达式将产生名称为的函数boo。但是,即使使用ES2015
+语义,也不会创建自动标识符:

var obj = {

    x: function() {

       console.log(typeof x);   // "undefined"

       console.log(obj.x.name); // "x"

    },

    y: function y() {

       console.log(typeof y);   // "function"

       console.log(obj.y.name); // "y"

    }

};

obj.x();

obj.y();

函数名称的分配是通过规范中各种操作中使用的SetFunctionName抽象操作完成的。

简短版本基本上是任何时候匿名函数表达式出现在诸如赋值或初始化之类的右侧时,例如:

var boo = function() { /*...*/ };

(或者可以是letconst而不是var,或者

var obj = {
    boo: function() { /*...*/ }
};

要么

doSomething({
    boo: function() { /*...*/ }
});

(最后两个实际上是同一件事) ,结果函数将具有名称(boo在示例中为)。

有一个重要的,有意的例外:分配给现有对象的属性:

obj.boo = function() { /*...*/ }; // <== Does not get a name

这是由于在添加新功能时引发了对信息泄漏的担忧。我在这里回答另一个问题的细节。



 类似资料:
  • 不是内置函数或关键字,但是如果函数名为,为什么我不能调用它呢? 调试控制台中没有错误消息,如果我将其重命名为all2,该函数就会工作。 这是代码:在chrome和IE10中测试

  • 前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点。 简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你就会发现其实是不切实际的。当然,如果你不关注调试,那就没什么可担心的了,否则,如果

  • 问题内容: 在下面的正则表达式中,表示空格字符。我想象正则表达式解析器正在遍历字符串,并且知道并知道下一个字符是特殊的。 但这不是事实,因为需要两次转义。 为什么是这样? 有没有具体的例子说明如何将一次逃生误解为其他? 问题答案: 您正在通过将字符串传递给RegExp构造函数来构造正则表达式。 是字符串文字中的转义字符。 该由字符串字面解析消耗… …因此,传递给RegEx编译器的数据是普通数据,而

  • 问题内容: 命名函数的返回参数有什么好处? 问题答案: 命名它们有一些好处: 它用作文档。 它们会自动声明并初始化为零值。 如果您有多个返回站点,则更改函数的返回值并不需要全部更改,因为它只会显示“ return”。 还有缺点,主要是很容易通过声明相同名称的变量来意外地遮盖它们。 有效的Go中有一个关于命名结果参数的部分: 可以给Go函数的返回或结果“参数”指定名称,并将其用作常规变量,就像传入参

  • 问题内容: 原始问题: 当我的JavaScript调用的功能在页面下方而不是在调用页面的下方定义时,JSHint会抱怨。但是,我的页面是用于游戏的,在下载全部内容之前,不会调用任何函数。那么为什么订单功能出现在我的代码中很重要? 我在里面吟。看来我需要花另一天的时间才能重新排序六千行代码。使用javascript的学习曲线一点也不陡峭,但是非常糟糕。 问题答案: tl; dr 如果在加载完成之前不

  • 本文向大家介绍为什么要用纯函数?相关面试题,主要包含被问及为什么要用纯函数?时的应答技巧和注意事项,需要的朋友参考一下 在此之前要先了解什么是纯函数,简单来说纯函数的定义有两个: 1.返回的结果只依赖于传入的参数。 2.执行过程中不产生副作用。 在这里就需要了解到什么是副作用 1.改变了外部变量或者对象属性 2.触发任何外部进程 3.发送http请求 4.调用其他有副作用的函数 5.…… 那么我们