JavaScript: 给一个函数和函数表达式同名可以吗?

JavaScript: Is it okay to give a function the same name as the function expression?

在 JavaScript 中,如果我创建如下函数表达式:

var foo = function foo() {
  return 'Hello world!';
}

这样可以吗?会不会出现什么问题?或者我应该这样做:

var foo = function baz() {
  return 'Hello world!';
}

这取决于你想要什么。内部名称是函数的局部名称;外部名称在外部范围内,并被闭包捕获。因此,如果您以不同的方式命名函数,则可以从内部重新分配外部引用:

var foo = function baz() {
  return foo;
};
var quux = foo;
foo = 17;
quux(); // => 17

当您将函数命名为不同相同时,这是不可能的,因为外部变量将无法访问,被内部变量覆盖。如果您想要 这种情况,那么您需要以不同的方式命名它们。但是,我不会说以任何一种方式命名函数都存在任何问题

编辑:除非您需要支持寿命终止的浏览器。然后小心龙

主要区别在于,在您的第一个示例中,当在函数内部时,foo 是一个影子变量,并不引用全局 foo。例如:

var foo = function foo() {
 foo = 1;
}
foo();
console.log(typeof(foo));

输出'function'因为我们只是在函数内部重新定义了foo。

但是,如果您以第二种方式定义函数,foo 指的是全局对象:

var foo = function baz() {
 foo = 1;
}
foo();
console.log(typeof(foo));

这将输出 'number' 因为我们已经修改了全局对象。