Javascript 为什么全局范围内的变量被分配给窗口对象?

Javascript 为什么全局范围内的变量被分配给窗口对象?,javascript,Javascript,似乎变量被指定为此的属性,但在匿名函数中,此引用父作用域,但不将变量指定给父作用域 var foo = 'bar'; console.log(window.foo); // bar 变量在非全局作用域中分配给什么对象?它们仅在声明它们的函数中可用 顺便说一句,函数作用域是JavaScript中唯一的其他作用域,与其他{}语言中的块作用域不同。) Re:你的编辑不要被愚弄了——JS的这个语义在我看来有点烦人--这个在各种情况下可能不是你所期望的。在自调用匿名函数中,例如: function()

似乎变量被指定为
的属性,但在匿名函数中,
引用父作用域,但不将变量指定给父作用域

var foo = 'bar';
console.log(window.foo); // bar

变量在非全局作用域中分配给什么对象?

它们仅在声明它们的函数中可用

顺便说一句,函数作用域是JavaScript中唯一的其他作用域,与其他
{}
语言中的块作用域不同。)


Re:你的编辑不要被愚弄了——JS的
这个
语义在我看来有点烦人--
这个
在各种情况下可能不是你所期望的。

在自调用匿名函数中,例如:

function() {
    var foo = 'bar';
}();

window.foo; // undefined
所有变量都保留在其内部,并且不会将其自身附加到全局对象或
窗口
。使用这种技术,可以创建如下模式


请注意,在JS中,变量具有函数级别作用域。

在JavaScript中,所有变量都分配给某个作用域对象。但是,在浏览器中,只有全局变量的scope对象可以通过
窗口
对象在JavaScript中访问。函数作用域中的变量分配给JavaScript运行时内部使用的某些作用域对象,但用户无法访问

在另一个环境中,全局变量可以作为另一个对象的属性访问(如中的
global
),也可以不可访问(如在Windows脚本主机内运行的应用程序脚本)。

引用:

每个执行上下文都有一个所谓的
变量对象
关联 用它。与执行上下文类似,变量对象是 抽象实体,描述变量实例化的机制。现在 有趣的是,在 源文本实际上是作为此变量对象的属性添加的

当控件为全局代码输入执行上下文时,
全局对象
用作
变量对象
。这正是为什么变量或 全局声明的函数成为
全局对象的属性

然而,这些变量对象是不可访问的。唯一的非内部对象是全局对象,
window
this
(在全局上下文中)


规范中的相关部分是。

为什么全局范围对象不是内部的,或者相反,为什么不能访问非全局范围对象?似乎不一致。无法直接访问任何范围对象。但是,任何代码都可以访问其自身范围内的变量,以及父范围内的变量。恰好全局范围是所有其他范围对象的父范围,这就是为什么它总是available@Gareth这是一个很好的论点。如果我们可以直接访问所有作用域对象,垃圾收集器在清理引用时会遇到麻烦。全局作用域包装了所有其他作用域,因此它始终可用,并且只能在脚本终止时进行垃圾收集。是的,我的编辑是错误的。关于你的帖子:为什么全局变量被分配给窗口对象?@ddlshack,因为在浏览器上下文中,全局范围就在这里。
窗口
对象的存在仅仅是为了表现为全局变量对象
?Ecmascript本身不需要一个
窗口
对象。可能具有其他主机定义的属性。例如,HTML规范定义了
function() {
    ....
}()