【发布时间】:2015-11-10 09:47:16
【问题描述】:
在 Babel JS (http://babeljs.io/repl/) 的在线 REPL 中,当我输入:
let a = (x) => x+1
它将被转译为:
"use strict";
var a = function a(x) {
return x + 1;
};
这里的var a = function a(x) 让我有点困惑,因为据我所知,var a = function(x) 或function a(x) 就足够了。
是否有人知道何时以及为什么需要将命名函数分配给变量?
【问题讨论】:
-
这不是必需的,但如果函数没有名称,它不会在某些浏览器的堆栈跟踪中显示为“函数 a”。因此命名函数有助于简化调试。否则它们会像“匿名函数”一样出现。
-
@Shilly 还有另一个区别 - 命名函数将其名称暴露给自己的范围。
-
@Alnitak:错了。仅当它是函数定义而不是函数表达式时,它才会将其名称暴露给范围(并使用提升)。这是一个(命名的)函数表达式,它只能通过变量(在这种情况下具有相同的名称)访问。但是考虑到 var 被称为
x的情况,你可以用x()调用函数a,因为a()是未定义的基本上它自己的行上的函数定义function lol(){}将与var lol = function lol(){}相同跨度> -
@Zorgatone 我认为我们达成了激烈的协议 - 我没有看到你写的任何内容不同意我的断言,即命名函数的名称在函数自己的范围内可用。
-
我觉得 cmets 和答案中的噪音太大了。所以这里是 tl;dr: 1) 箭头函数是表达式,而不是声明,因此我们需要使用函数表达式。 2) 在 ES6 中,函数名有时是从分配给它的变量中推断出来的,因此使用了 named 函数表达式。理想情况下,可以分配给
a.name = 'a',但并非所有浏览器都支持这一点。