关于Javascript范围链

时间:2011-12-23 10:42:29

标签: javascript function chain

它们之间的区别是什么?
①功能的范围 - >②[[范围]] ---->③scope

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

someFunction的范围
someFunction [[scope]]
窗口范围
是对的吗?

1 个答案:

答案 0 :(得分:4)

如果您想了解范围链,您应该阅读Richard Cornford关于JavaScript Closures的文章,特别是关于Identifier Resolution, Execution Contexts and scope chains的文章。

简而言之,范围链从变量/激活对象传播到变量/激活对象,使用全局对象停止(因为全局对象实际上是全局执行上下文的激活/变量对象)。

所以在:

的情况下
var fred;

function foo() {
    alert(fred);
}

标识符 fred 是全局变量/激活对象的属性(在全局代码的情况下是全局对象本身)。调用 foo()时,将使用包含全局对象的作用域链创建新的变量/激活对象。标识符 fred 首先在内部变量对象上解析,因为在那里找不到它,所以搜索链上的下一个对象(全局对象)。

同样适用于:

function foo() {
    function bar() {
        alert(fred);
    }
    bar();
}

所以当调用 foo()时,它会调用 bar(),现在 fred 首先解决bar的变量对象,然后是foo,然后是全局对象。

一旦理解了执行上下文,您也会意识到为什么调用 this “context”的值会产生误导。