他们有什么区别?
①函数作用域-->②[[作用域]]---->③作用域
var scope = 'window';
var someFunction = function(){
something go here....
}
someFunction 的作用域
someFunction[[scope]]
窗口作用域
是这样吗?
他们有什么区别?
①函数作用域-->②[[作用域]]---->③作用域
var scope = 'window';
var someFunction = function(){
something go here....
}
someFunction 的作用域
someFunction[[scope]]
窗口作用域
是这样吗?
如果你想了解作用域链,你应该阅读 Richard Cornford 关于JavaScript Closures的文章,特别是关于标识符解析、执行上下文和作用域链的部分。
简而言之,作用域链从变量/激活对象移动到变量/激活对象,在全局对象处停止(因为全局对象实际上是全局执行上下文的激活/变量对象)。
所以在以下情况下:
var fred;
function foo() {
alert(fred);
}
标识符fred成为全局变量/激活对象的一个属性(在全局代码的情况下是全局对象本身)。当foo()被调用时,一个新的变量/激活对象被创建了一个包含全局对象的作用域链。标识符fred首先在内部变量对象上解析,并且由于它不会在那里找到,因此搜索链上的下一个对象(全局对象)。
同样适用于:
function foo() {
function bar() {
alert(fred);
}
bar();
}
所以当foo()被调用时,它会调用bar(),现在fred被解析为首先是 bar 的变量对象,然后是 foo 的,然后是全局对象。
一旦你理解了执行上下文,你就会明白为什么调用这个“上下文”的值会产生误导。