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
引用http://perfectionkills.com/understanding-delete/#execution_context:
每个执行上下文都有一个所谓的
Variable Object
与之关联。类似于执行上下文,变量对象是一个抽象实体,一种描述变量实例化的机制。现在,有趣的部分是,在源文本中声明的变量和函数实际上被添加为此变量对象的属性。当控制进入全局代码的执行上下文时,使用
Global object
作为Variable object
。这正是为什么全局声明的变量或函数成为Global object
属性的原因。
然而,这些Variable Object
是不可访问的。唯一的非内部变量是全局对象window
或this
(在全局上下文中)。
window
对象访问。函数作用域中的变量被分配给JavaScript运行时内部使用的某些作用域对象,但用户无法访问该对象。GLOBAL
),或者可能不可访问(例如在Windows脚本宿主程序中运行的应用程序脚本)。它们仅在声明它们的函数中可用。
JavaScript 中只有函数作用域,不像其他语言(如使用 {}
的块作用域)。
关于您的编辑 不要被愚弄了 - 在我看来,JS 的 this
语义有点让人恼火 - 在各种情况下,this
可能不是您预期的内容。
在自调用匿名函数内,例如:
function() {
....
}()
所有变量都保留在其中,不会附加到全局对象或window
。使用这种技术,可以创建模式,例如module/singleton pattern。
请注意,在JS中,变量具有函数级别作用域。
window
对象存在的唯一目的就是作为全局的变量对象
吗? - Cameron Martinwindow
对象。*全局对象可能具有其他主机定义的属性。*例如,HTML规范定义了Window
接口。 - Bergi