它们之间的区别是什么?
①功能的范围 - >②[[范围]] ---->③scope
var scope = 'window';
var someFunction = function(){
something go here....
}
someFunction的范围
someFunction [[scope]]
窗口范围
是对的吗?
答案 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”的值会产生误导。