var foo = 'bar';
console.log(window.foo); // bar
似乎变量作为属性分配给this
,但在匿名函数内部,this
是指父范围,但不将变量分配给父范围。
function() {
var foo = 'bar';
}();
window.foo; // undefined
变量在非全局范围内分配给什么对象?
var foo = 'bar';
console.log(window.foo); // bar
似乎变量作为属性分配给this
,但在匿名函数内部,this
是指父范围,但不将变量分配给父范围。
function() {
var foo = 'bar';
}();
window.foo; // undefined
变量在非全局范围内分配给什么对象?
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 aVariable object
. This is precisely why variables or functions declared globally become properties of aGlobal object
Yet, these Variable Object
s 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.
在 JavaScript 中,所有变量都分配给某个范围对象。但是,在浏览器中的 JavaScript 中只能通过对象访问全局变量的作用域window
对象。函数作用域中的变量被分配给 JavaScript 运行时内部使用的某个作用域对象,但用户无法访问。
在另一个环境中,全局变量可以作为另一个对象的属性来访问(例如GLOBAL
在node.js中),或者可能是不可访问的(例如在 Windows 脚本宿主中运行的应用程序脚本)。
它们仅在声明它们的函数中可用。
函数作用域是 JavaScript 中唯一的其他作用域,顺便说一句,与其他{}
语言中的块作用域不同。)
回复:你的编辑不要被愚弄this
——JS 的语义在 IMO 中有点令人讨厌——this
在各种情况下可能不是你所期望的。
内部自调用匿名函数,例如:
function() {
....
}()
所有变量都保留在其中,并且不会将自己附加到全局对象或window
. 使用该技术,可以创建诸如模块/单例模式之类的模式。
请注意,在 JS 中,变量具有函数级范围。