我想问一下JavaScript中Window
和window
全局对象之间有什么不同?
我使用它们并得到了不同的结果。
示例(使用window
)
(function (GlobalObj, name) {
var greeting = 'Hello';
GlobalObj.greeting = 'Replace Hola'
console.log(greeting + ',' + name);
}(window, 'Melo'));
console.log(greeting);
结果: 你好,梅洛 取代Hola
示例(使用Window
)
(function (GlobalObj, name) {
var greeting = 'Hello';
GlobalObj.greeting = 'Replace Hola'
console.log(greeting + ',' + name);
}(Window, 'Melo'));
console.log(greeting);
结果: 你好,梅洛 HOLA
答案 0 :(得分:1)
您的第一个示例首先声明并初始化名为greeting
的本地变量,该变量只能在函数中访问,并将隐藏{上的任何全局greeting
属性。 {1}}。然后在下一行中,它在window
对象上设置greeting
属性,根据window
对象的属性,该属性是全局变量只能使用window
访问(如果没有被局部变量遮蔽,就像在这种情况下一样)。
当您在greeting
中使用greeting
,在函数外部,第二个示例的末尾,它正在从{{1}获取值时,您会感到困惑在第一个例子中设置。您需要单独测试第二个示例。为此,在运行它之前键入console.log
或刷新浏览器,删除第一个示例中设置的window
上的delete window.greeting;
属性。但是,在严格模式下,由于greeting
未定义,因此会导致window
。在下面的第二个片段中,为了解决这个问题,我在全局范围内定义了ReferenceError
。
如第二个示例中那样将属性分配给greeting
,什么都不做。 greeting
(窗口构造函数)上没有任何内容可用于任何事情。您也可以将Window
属性分配给空对象,或者根本不分配它。
Window
greeting
以下是一些提示:
如果您尝试访问全局变量,请不要使用(function (GlobalObj, name) {
var greeting = 'Hello';
GlobalObj.greeting = 'Replace Hola'; // assigns to `window.greeting` === `greeting`
console.log(greeting + ', ' + name); // prints local `greeting`
}(window, 'Melo'));
console.log(greeting); // prints `window.greeting`
。使用var greeting;
(function (GlobalObj, name) {
var greeting = 'Hello';
GlobalObj.greeting = 'Replace Hola'; // assigns to `Window.greeting`
console.log(greeting + ', ' + name); // prints local `greeting`
}(Window, 'Melo'));
console.log(greeting); // prints `window.greeting` (undefined)
。 Window
毫无意义且无关紧要。
根本不要使用全局变量。
如果您使用全局变量,请通过在函数内定义具有相同名称的局部变量来避免让自己和他人混淆。
答案 1 :(得分:0)
窗口对象表示浏览器中的打开窗口。
如果文档包含框架(标签),浏览器会为HTML文档创建一个窗口对象,并为每个框架创建一个额外的窗口对象。
注意:没有适用于Window对象的公共标准,但所有主流浏览器都支持它。
然而,Window是一个功能。它是windows的构造函数(但是你无法直接使用构造函数构建新窗口,通常使用Window.open函数)。因此,Window.prototype保存了可以在窗口上调用的方法。
有关详细信息,请参阅here。