Javascript:在使用局部变量之前使用的全局变量(jQuery JavaScript教程中的示例)



在 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"

现在我想知道为什么输出是世界而不是你好。变量foomyFunction中本地绑定。然后在myFn中,foo被访问。我会说评估应该向下进行范围,这将是myFn中的声明,然后在myFunction中声明,最后一个应该是全局变量。

那么,为什么即使 myFunction 中的定义在范围内不那么远,全局变量输出呢?

如果我删除标有 x 行的,则局部变量将按预期输出。

foomyFunction上下文中的局部变量。因此,当您调用 myFn 函数时,您正在访问 foo 变量的实际(在本例中为最后一个)值。

请注意,问题标题中存在错误。 foo不是全球性的。但本地myFunction

函数是 Javascript 中的对象,对象是通过引用而不是值传递的。此外,返回对象实质上是传递对象。或者,您可以将其称为通过引用返回。

在全局空间中运行的 myFn 函数保留了定义相同的范围。这就是导致 f() 坚持对 foo 变量所做的更改并首先访问 foo 变量的原因。

http://learn.jquery.com/javascript-101/scope/,文本的布局在这里略有误导。引用页面下方代码的文本后跟一个冒号。您所引用的文本是针对其上面的代码的,这很可能是导致混淆的原因。

最新更新