全局变量在Chrome中并不那么全球化

时间:2013-03-08 07:00:06

标签: javascript jquery

我正在学习JavaScript并在jQuery的网站上浏览this教程。

以下示例

    // 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()时,我看不到预期的输出。相反,变量是undefined。但是,如果我通过将全局变量分配给window.myName来定义全局变量,那么它就可以工作。

我使用的是Chrome版本25.0.1364.152 m。

教程不正确或我遗失了什么?

完整的HTML就在这里:http://pastebin.com/4M27vDB4

更新:接受的答案解释了发生了什么。我还想提一下可能的解决方案 - 在没有var的情况下声明全局变量。由于以下原因:

  

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

2 个答案:

答案 0 :(得分:4)

您已将此代码放入

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

闭合。在这种情况下,它内部的上下文不会是window(它将是document对象),你将会得到undefined

答案 1 :(得分:3)

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