为什么变量成为窗口对象的键?

时间:2014-07-06 19:53:13

标签: javascript

我注意到变量成为键,当我在窗口对象上写时,它们的值成为所述键的值。例如:

var variable = "value";
console.log(window.variable);//logs "value"

但是如果我创建一个我自己的新对象:

var o = {
    key: "value",
    var key2 = "value2"
}; // result: "syntax error"

我必须使用冒号来设置键/值对。即使使用构造函数,虽然我没有得到语法错误,但我似乎无法在构造函数内或在对象实例化期间或之后执行此操作:

function Blueprint(){
    this.key = "value";
    var key2 = "value2";
}

var o = new Blueprint;
console.log(o.key); //result: "value"
console.log(o.key2); //result: "undefined"

现在,我理解为什么,在前一种情况下,我生成了一个语法错误,为什么在后一种情况下我无法将key2附加到Blueprint构造函数,但是我不明白为什么在全局窗口对象我给予自由范围只是使用变量添加属性,它们立即成为窗口对象上的键。除了在windows对象上,变量似乎表现为独立于对象和属性创建。

在尝试使用节点时,我还注意到了全局对象上的类似行为。全局对象是唯一可以使用变量以这种方式设置键/值对的对象吗?如果是这样,为什么?在全球范围内工作时,为什么我们不得强制执行以下操作:

this.key = "value";

或者...

window.key = "value";

这只是对整个语言行为的一些警告,还是有一些关于窗口对象的内部一致逻辑与所有解释这个问题的其他对象相关?

2 个答案:

答案 0 :(得分:4)

全局变量(与函数中声明的局部变量相对)成为全局对象的属性。

在浏览器中,全局对象为window

答案 1 :(得分:2)

全球环境是所谓的Object Environment (Record)

  

每个对象环境记录都与称为其绑定对象的对象相关联。对象环境记录绑定直接对应于其绑定对象的属性名称的标识符名称集。

如您所见,显式定义了为标识符创建属性的行为。对于全局环境,绑定对象是全局对象,在浏览器中为window

有关环境的更多详细信息,请参阅spec

  

本规范中使用了两种环境记录值:声明性环境记录对象环境记录。声明性环境记录用于定义ECMAScript语言语法元素的效果,例如 FunctionDeclarations VariableDeclarations Catch 子句,它们直接将标识符绑定与ECMAScript语言值。对象环境记录用于定义ECMAScript元素的效果,例如 Program WithStatement ,它们将标识符绑定与某个对象的属性相关联。

我无法告诉你为什么存在这两种类型。如果您想知道,可以在http://esdiscuss.org/

询问