Javascript 全局对象和窗口对象的差异

Javascript 全局对象和窗口对象的差异,javascript,Javascript,JavaScript全局对象和窗口对象之间的区别是什么。我知道在这两种情况下,使用方法时不必声明对象。我可能错了,但在我看来,所谓的全局变量是在window对象下定义的。window对象封装了全局范围。声明变量时省略var(或let)将隐式地将其作为属性添加到全局范围。从这个意义上讲,它是独一无二的,因为在不同的范围内没有与window等价的东西 我将在这个问题上: 声明全局作用域绑定到全局对象。这意味着声明一个变量(在顶层使用var,或者在函数内部不使用var)只需将一个新属性添加到窗口(或浏

JavaScript全局对象和窗口对象之间的区别是什么。我知道在这两种情况下,使用方法时不必声明对象。

我可能错了,但在我看来,所谓的全局变量是在window对象下定义的。

window对象封装了全局范围。声明变量时省略
var
(或
let
)将隐式地将其作为属性添加到全局范围。从这个意义上讲,它是独一无二的,因为在不同的范围内没有与
window
等价的东西

我将在这个问题上:

声明全局作用域绑定到全局对象。这意味着声明一个变量(在顶层使用var,或者在函数内部不使用var)只需将一个新属性添加到
窗口(或浏览器外部的等效属性)

试试看。不使用
var
创建变量,然后查看控制台中的
窗口
对象。你会在那里看到的。这相当于这样做:

Object.defineProperty(window, 'foo', {
 value: "bar",
 enumerable: true // see @dandavis' comment on iterating over implicit global vars
)}

这并不能解释为什么会这样。只有
window
是唯一的,因为它定义了所有内容。

在浏览器中运行的JavaScript中,window位于作用域链的顶部。如果定义了“全局”变量,则表示该变量位于窗口对象下

例如:

// Global variable
var g = 0;

function foo(){
    window.g = 1

    // This will output '1'
    alert(g); 
}

您必须声明它们才能使用它们,只是它们会自动为您声明,并且Window.prototype和所有原型一样,可以立即对所有实例进行修改。您是在谈论浏览器JS吗?您可以在服务器上运行JS。没有
窗口
。我认为,浏览器没有全局的;非严格this、window、self、top、隐式发布(非var声明),({}).constructor.prototype、window.prototype、Object.prototype等。其中一个上的任何添加都将在所有作用域中显示为词法名称。“严格使用”大大减少了但并不能消除这种疯狂。你知道哪些浏览器是例外吗?我现在很好奇。我偶尔会尝试通过window对象访问globals。我想我们都能猜到是哪一个,但它与“dry heave”押韵,直到第九个版本才支持“real”js。呵呵,明白了。我在一个新版本的IE上测试了这个,它成功了(呸)。至少现在他们遵循的是其他人都遵循的标准。默认情况下enumerable为false,但隐式全局变量在window下是iterable。我认为“Global”可能意味着更多的概念,而不是特定的对象。在nodejs中,没有像浏览器的“窗口”那样的“全局”,但节点的“全局”提供了粗略的等价物及其全局.constructor.prototype===Object.prototype,而Window.constructor.prototype==让人深思的是:如果“窗口位于作用域链的顶端”,为什么它继承自Object.prototype和window.prototype?