Javascript 全局变量在Chrome中不是全局变量
我正在学习JavaScript并在jQuery的网站上学习教程 在下面的例子中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
// 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(){…};”