var foo = 'bar';
console.log(window.foo); // bar
似乎变量被赋值为this
的属性,但在匿名函数内,this
引用父作用域,但不将变量赋给父作用域。
function() {
var foo = 'bar';
}();
window.foo; // undefined
变量在非全局范围内分配给哪个对象?
答案 0 :(得分:5)
引用http://perfectionkills.com/understanding-delete/#execution_context:
每个执行上下文都有一个所谓的
Variable Object
关联 用它。与执行上下文类似,Variable对象是一个 抽象实体,一种描述变量实例化的机制。现在, interesing部分是在a中声明的变量和函数 源文本实际上是添加为此Variable对象的属性。当控制进入全局代码的执行上下文时,
的属性Global object
用作Variable object
。这正是变量或原因 全局声明的函数成为Global object
然而,这些Variable Object
无法访问。唯一的非内部对象是全局对象window
或this
(在全局范围内)。
答案 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中,变量具有功能级范围。