0

他们有什么区别?
①函数作用域-->②[[作用域]]---->③作用域

var scope = 'window';
var someFunction = function(){
    something go here....
}

someFunction 的作用域
someFunction[[scope]]
窗口作用域
是这样吗?

4

1 回答 1

4

如果你想了解作用域链,你应该阅读 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 的,然后是全局对象。

一旦你理解了执行上下文,你就会明白为什么调用这个“上下文”的值会产生误导。

于 2011-12-23T10:54:05.453 回答