在 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"
现在我想知道为什么输出是世界而不是你好。变量foo在myFunction中本地绑定。然后在myFn中,foo被访问。我会说评估应该向下进行范围,这将是myFn中的声明,然后在myFunction中声明,最后一个应该是全局变量。
那么,为什么即使 myFunction 中的定义在范围内不那么远,全局变量输出呢?
如果我删除标有 x 行的行,则局部变量将按预期输出。
foo
是myFunction
上下文中的局部变量。因此,当您调用 myFn
函数时,您正在访问 foo
变量的实际(在本例中为最后一个)值。
请注意,问题标题中存在错误。 foo
不是全球性的。但本地myFunction
函数是 Javascript 中的对象,对象是通过引用而不是值传递的。此外,返回对象实质上是传递对象。或者,您可以将其称为通过引用返回。
在全局空间中运行的 myFn 函数保留了定义相同的范围。这就是导致 f() 坚持对 foo 变量所做的更改并首先访问 foo 变量的原因。
http://learn.jquery.com/javascript-101/scope/,文本的布局在这里略有误导。引用页面下方代码的文本后跟一个冒号。您所引用的文本是针对其上面的代码的,这很可能是导致混淆的原因。