3

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

我正在使用 Chrome 版本 25.0.1364.152 m。

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

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

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

此外,在没有 var 关键字的函数内声明的变量不是函数的本地变量——JavaScript 将遍历作用域链一直到窗口作用域以查找变量先前定义的位置。如果变量之前没有定义,它将在全局范围内定义,这可能会产生意想不到的后果。

4

2 回答 2

4

您已将此代码放入

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

关闭。在这种情况下,它里面的上下文不会是window(它将是document对象),你会得到undefined你所描述的。

于 2013-03-08T07:07:29.870 回答
3

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

于 2013-03-08T07:11:22.583 回答