2013-04-10 134 views
-1

我想学习JS,并且相对于JavaScript的闭包我有一个问题 -的Javascript关闭

function fooOuter(){ 
    var a = 10; 
    var b = 20; 
    return function fooinner(x){ 
     return a + b + x; 
    }; 
} 

这是否意味着,在Javascript商店引用内部函数所有处于同一范围变量。即在这种情况下,fooinner是否存储变量a和b的引用。

+0

http://stackoverflow.com/questions/500431/javascript-variable-scope – Ofiris 2013-04-10 18:41:48

+1

..........是的。 – svidgen 2013-04-10 18:41:53

回答

3

实际上,是的。有一个由运行时创建的所谓的“作用域链”,链中的链接只在不再引用时释放。 fooinner()有其自己的范围,“范围”链接到范围fooOuter(),等等 - 这是fooinner()的范围链。

fooinner()所使用的变量及其外部定义的变量因此将继续存在,至少与该特定函数对象所处的时间一样长。

0

fooInner将为返回的每个fooInner实例保留a和b的值。换句话说,每个函数将等于10 + 20 + x。实际上它是一个封闭和一个局部。

0

这是我从培训中得到的一些事实。我希望这有助于

在创建功能,它被分配一个[[scope]]属性 它引用外词法范围的变量并防止 它们被垃圾收集。因此封闭形成于 函数创建。

闭包引用变量不是值。由于每个函数调用都发生在唯一的执行上下文中,因此我们保证连续调用中参数变量的唯一性。

其需要注意的是封闭创建过程是每一个功能相同的 ,每个函数创建一个封闭

0

是它几乎做到这一点。

简单地说,一个封闭不是别的,只是一个上下文它可以访问其父上下文数据。在Stackoverflow或Web上有很多很好的解释。

但没有进入更详细的,第二你的内在功能fooinner被解析,ECMAScript的解释器内部设置了外部函数的链接(我们称之为分别激活对象词法环境记录)。