JavaScript函数返回全局变量并将其分配给自身,然后分配给其他内容。

3
var bar = function foo() {
  foo = 1;
  return foo;
};
bar(); // returns function foo()

为什么会发生这种情况?我期望返回值为1。

那不是语法错误吗?你能这样命名一个匿名函数吗? - Thilo
如果这是一个语法错误,为什么我的Firefox接受了那种语言呢? - jetru
@Thilo 这是JS,一堆(可能)不好的事在技术上是合法的。这是一种合法的做法。虽然并没有太多意义...但foobar都将引用同一个函数。 - Sumner Evans
不,bar将代表函数声明的返回值。 - jkd
3个回答

3
如果你想返回1,你需要这样写:

var bar = function() {
  foo = 1;
  return foo;
};

LVarayut的答案实际上是正确的,你正在覆盖全局命名空间中的foo。这个版本声明了一个局部变量foo。

var bar = function() {
  var foo = 1;
  return foo;
};

我知道。但是我很想知道为什么会发生这种情况。 - jetru
1
@jetru,你正在将一个函数声明分配给bar。而不是函数本身。 - jkd

2

由于您定义了两次foo变量,因此如果您想要返回1,您可以将函数名称更改为任何其他名称:

var bar = function baz() {
  foo = 1;
  return foo;
};
bar(); // returns 1

或者您可以定义一个本地变量:

var bar = function foo() {
  var foo = 1;
  return foo;
};
bar(); // returns 1
编辑: 这是你问题的答案。命名函数表达式的名称成为本地变量,只能在函数表达式内部访问。函数名和分配给函数的变量之间有区别。 函数名不能更改,而分配给函数的变量可以被重新分配。 在MDN上阅读更多

var bar = function foo(){} 你能解释一下这个“命名匿名函数”的语法是如何工作的吗? - Thilo
1
@Thilo 请查看这个 Stack Overflow 的问题:https://dev59.com/22865IYBdhLWcg3wW9RE。 - Sumner Evans
1
@Thilo,是的,当您的函数出现错误时,这个命名函数表达式非常有用,因为编译器可以告诉您导致错误的确切函数。 - lvarayut

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接