我想学习JS,并且相对于JavaScript的闭包我有一个问题 -的Javascript关闭
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着,在Javascript商店引用内部函数所有处于同一范围变量。即在这种情况下,fooinner是否存储变量a和b的引用。
我想学习JS,并且相对于JavaScript的闭包我有一个问题 -的Javascript关闭
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着,在Javascript商店引用内部函数所有处于同一范围变量。即在这种情况下,fooinner是否存储变量a和b的引用。
实际上,是的。有一个由运行时创建的所谓的“作用域链”,链中的链接只在不再引用时释放。 fooinner()
有其自己的范围,“范围”链接到范围fooOuter()
,等等 - 这是fooinner()
的范围链。
fooinner()
所使用的变量及其外部定义的变量因此将继续存在,至少与该特定函数对象所处的时间一样长。
fooInner将为返回的每个fooInner实例保留a和b的值。换句话说,每个函数将等于10 + 20 + x。实际上它是一个封闭和一个局部。
这是我从培训中得到的一些事实。我希望这有助于
在创建功能,它被分配一个[[scope]]属性 它引用外词法范围的变量并防止 它们被垃圾收集。因此封闭形成于 函数创建。
闭包引用变量不是值。由于每个函数调用都发生在唯一的执行上下文中,因此我们保证连续调用中参数变量的唯一性。
其需要注意的是封闭创建过程是每一个功能相同的 ,每个函数创建一个封闭
是它几乎做到这一点。
简单地说,一个封闭不是别的,只是一个上下文它可以访问其父上下文数据。在Stackoverflow或Web上有很多很好的解释。
但没有进入更详细的,第二你的内在功能fooinner
被解析,ECMAScript的解释器内部设置了外部函数的链接(我们称之为分别激活对象词法环境记录)。
http://stackoverflow.com/questions/500431/javascript-variable-scope – Ofiris 2013-04-10 18:41:48
..........是的。 – svidgen 2013-04-10 18:41:53