Javascript 全局变量在Chrome中不是全局变量

Javascript 全局变量在Chrome中不是全局变量,javascript,jquery,Javascript,Jquery,我正在学习JavaScript并在jQuery的网站上学习教程 在下面的例子中 // A function being attached to an object at runtime var myName = "the global object"; var sayHello = function () { console.log("Hi! My name is " + this.myName); }; var myObject

我正在学习JavaScript并在jQuery的网站上学习教程

在下面的例子中

    // A function being attached to an object at runtime
    var myName = "the global object";
    var sayHello = function ()
    {
        console.log("Hi! My name is " + this.myName);
    };
    var myObject = {
        myName: "Rebecca"
    };
    var secondObject = {
        myName: "Colin"
    };

    myObject.sayHello = sayHello;
    secondObject.sayHello = sayHello;

    sayHello();              // "Hi! My name is the global object"
    myObject.sayHello();     // "Hi! My name is Rebecca"
    secondObject.sayHello(); // "Hi! My name is Colin"
调用
sayHello()
时,我看不到预期的输出。相反,变量是
未定义的
。但如果我通过将全局变量赋值给
window.myName
来定义它,它就会工作

我使用的是Chrome版本25.0.1364.152 m

是教程不正确还是我遗漏了什么

完整的HTML在这里:

更新:接受的答案解释了发生的事情。我还想提到可能的解决方案——在上面声明全局变量时不使用
var
。由于以下原因:

此外,在函数中声明的变量没有 var关键字不是函数的本地关键字-JavaScript将遍历 范围链一直到窗口范围,以查找 变量是以前定义的。如果变量以前没有被调用 定义后,它将在全局范围内定义,该范围可以具有 意外的后果


你已经把这个代码放进去了

$(document).ready(function ()
    // ...
}); 

结束。在这种情况下,它内部的上下文将不是
窗口
(它将是
文档
对象),您将得到所描述的
未定义的

您在程序中使用了
this.myName
关键字用于指向当前对象。当您只调用
sayHello()
时,在这种情况下,“this”表示“window”,因为默认的当前对象是window。现在您还没有定义
窗口。myName
那么它将给出“未定义”。

在这里工作(Chrome 25)。你是如何运行你的代码的?这似乎在我的Chrome 25上运行得很好,也许你已经把这段代码放在
$(function(){…})里面了结束?在这种情况下,它里面的上下文将不会是
窗口
,您将得到您描述的
未定义的
。听起来像是将示例代码放在函数体中,这意味着第一个“var myName”将为该函数创建一个局部变量。如果您使用window.myName,您将显式地分配给全局作用域。对,正如我们所说的,您的“var myName”分配在一个函数中:“$(document).ready(function(){…};”