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

似乎变量作为属性分配给this,但在匿名函数内部,this是指父范围,但不将变量分配给父范围。

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

window.foo; // undefined

变量在非全局范围内分配给什么对象?

4

4 回答 4

5

To cite http://perfectionkills.com/understanding-delete/#execution_context:

Every execution context has a so-called Variable Object associated with it. Similarly to execution context, Variable object is an abstract entity, a mechanism to describe variable instantiation. Now, the interesing part is that variables and functions declared in a source text are actually added as properties of this Variable object.

When control enters execution context for Global code, a Global object is used as a Variable object. This is precisely why variables or functions declared globally become properties of a Global object

Yet, these Variable Objects are not accessible. The only non-internal one is the global object, window or this (in global context).

The relevant section in the specification is #10: Executable Code and Execution Contexts.

于 2012-06-05T16:44:51.587 回答
2

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

在另一个环境中,全局变量可以作为另一个对象的属性来访问(例如GLOBALnode.js中),或者可能是不可访问的(例如在 Windows 脚本宿主中运行的应用程序脚本)。

于 2012-06-05T16:42:31.227 回答
0

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

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

回复:你的编辑不要被愚弄this——JS 的语义在 IMO 中有点令人讨厌——this在各种情况下可能不是你所期望的。

于 2012-06-05T16:40:13.987 回答
0

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

function() {
    ....
}()

所有变量都保留在其中,并且不会将自己附加到全局对象或window. 使用该技术,可以创建诸如模块/单例模式之类的模式

请注意,在 JS 中,变量具有函数级范围。

于 2012-06-05T16:40:32.780 回答