2011-12-23 66 views
0

他们之间有什么区别?
①function的范围 - >②[[范围]] ---->③scope关于JavaScript范围连锁店

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

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

+2

请让你的问题更清楚。我不知道你在问什么。 Javascript中的变量既可以是本地的,也可以是全局的:没有其他的可能性。 – 2011-12-23 10:49:58

+0

在你的例子中,现在只有两个“范围”被称为词法环境:(1)函数的范围,(2)全局范围。 – 2011-12-23 13:25:21

回答

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(); 
} 

所以当富()被调用,然后调用巴(),现在弗雷德是针对首次栏的变量对象,那么富的,然后解决全局对象。

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

+1

变量/激活对象从ES5开始称为*环境记录*,而函数的[[Scope]]存储它的*词法环境*(它是所有者或*环境记录*)。 – 2011-12-23 13:26:06

+0

谢谢,必须深入到ES5,我现在有点懒惰,有点忽略它。但我想时间已经到来了。 – RobG 2011-12-24 04:11:58