var bar = function foo() {
foo = 1;
return foo;
};
bar(); // returns function foo()
为什么会发生这种情况?我期望返回值为1。
var bar = function foo() {
foo = 1;
return foo;
};
bar(); // returns function foo()
var bar = function() {
foo = 1;
return foo;
};
LVarayut的答案实际上是正确的,你正在覆盖全局命名空间中的foo。这个版本声明了一个局部变量foo。
var bar = function() {
var foo = 1;
return foo;
};
由于您定义了两次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这里有一个类似的问题,描述了相同的行为...
还有一篇相关文章描述了发生了什么...
http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
foo
和bar
都将引用同一个函数。 - Sumner Evans