在关于JavaScript的jQuery教程(http://learn.jquery.com/javascript-101/scope/)中,有关于范围的以下示例:
var myFunction = function() {
var foo = "hello";
var myFn = function() {
console.log( foo );
};
foo = "world"; // line x
return myFn;
};
var f = myFunction();
f(); // "world"
现在我想知道为什么输出是 world 而不是 hello 。变量 foo 在 myFunction 中本地绑定。然后在 myFn 中,访问 foo 。我会说评估应该在范围内进行,这将是 myFn 中的声明,然后是 myFunction 中的声明,最后一个应该是全局变量。
那么,为什么全局变量输出即使 myFunction 中的定义在范围内距离较远?
如果我删除标有 line x 的行,则按预期输出局部变量。
答案 0 :(得分:1)
foo
是myFunction
上下文中的局部变量。因此,当您调用myFn
函数时,您正在访问foo
变量的实际值(在本例中为最后一个)。
注意,问题标题中有错误。 foo
不是全球性的。但是myFunction
答案 1 :(得分:0)
函数是Javascript中的对象,对象通过引用而不是值传递。此外,返回Object实质上是传递Object。或者,您可以将其称为通过引用返回。
在全局空间中运行的myFn函数保留了与其定义的范围相同的范围。这是导致f()遵循对foo变量所做的更改以及访问foo变量的原因。
文字布局在这里有点误导http://learn.jquery.com/javascript-101/scope/。引用页面下方代码的文本后跟冒号。您所指的文本是针对其上方的代码,这很可能是造成混淆的原因。