为什么全局范围中的变量被赋值给窗口对象?

时间:2012-06-05 16:38:28

标签: javascript

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

似乎变量被赋值为this的属性,但在匿名函数内,this引用父作用域,但不将变量赋给父作用域。

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

window.foo; // undefined

变量在非全局范围内分配给哪个对象?

4 个答案:

答案 0 :(得分:5)

引用http://perfectionkills.com/understanding-delete/#execution_context

  

每个执行上下文都有一个所谓的Variable Object关联   用它。与执行上下文类似,Variable对象是一个   抽象实体,一种描述变量实例化的机制。现在,   interesing部分是在a中声明的变量和函数   源文本实际上是添加为此Variable对象的属性

     

当控制进入全局代码的执行上下文时,Global object   用作Variable object。这正是变量或原因   全局声明的函数成为Global object

的属性

然而,这些Variable Object无法访问。唯一的非内部对象是全局对象windowthis(在全局范围内)。

规范中的相关部分为#10: Executable Code and Execution Contexts

答案 1 :(得分:2)

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

在另一个环境中,全局变量可以作为另一个对象的属性(例如node.js中的GLOBAL)访问,也可能无法访问(例如在Windows脚本宿主中运行的应用程序脚本)。 / p>

答案 2 :(得分:0)

它们仅在声明的功能中可用。

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

Re:你的编辑不要被愚弄 - JS的this语义有点令人厌烦的IMO - this可能不是你所期望的各种情况。

答案 3 :(得分:0)

内部自我调用匿名函数,例如:

function() {
    ....
}()

所有变量都保留在其中,并且不会将自身附加到全局对象或window。使用该技术,可以创建模式,例如module/singleton pattern

请注意,在JS中,变量具有功能级范围。