JavaScript全局对象窗口和窗口

时间:2016-12-12 03:34:22

标签: javascript

我想问一下JavaScript中Windowwindow全局对象之间有什么不同? 我使用它们并得到了不同的结果。

示例(使用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

2 个答案:

答案 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

以下是一些提示:

  1. 如果您尝试访问全局变量,请不要使用(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毫无意义且无关紧要。

  2. 根本不要使用全局变量。

  3. 如果您使用全局变量,请通过在函数内定义具有相同名称的局部变量来避免让自己和他人混淆。

答案 1 :(得分:0)

窗口对象表示浏览器中的打开窗口。

如果文档包含框架(标签),浏览器会为HTML文档创建一个窗口对象,并为每个框架创建一个额外的窗口对象。

注意:没有适用于Window对象的公共标准,但所有主流浏览器都支持它。

然而,Window是一个功能。它是windows的构造函数(但是你无法直接使用构造函数构建新窗口,通常使用Window.open函数)。因此,Window.prototype保存了可以在窗口上调用的方法。

有关详细信息,请参阅here