我正在学习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将遍历 范围链一直到窗口范围内找到的地方 变量先前已定义。如果之前没有变量 定义后,它将在全局范围内定义,它可以具有 意想不到的后果。
答案 0 :(得分:4)
您已将此代码放入
$(document).ready(function ()
// ...
});
闭合。在这种情况下,它内部的上下文不会是window
(它将是document
对象),你将会得到undefined
。
答案 1 :(得分:3)
在您的计划中,您使用了this.myName
。 this
关键字用于指向当前对象。当你只调用sayHello()
时,那么在这种情况下,“this”意味着“窗口”,因为默认的当前对象是窗口。现在你还没有定义window.myName
,那么它将给出“未定义”。