我正在尝试学习 JS 并且关于 javascript 闭包我有一个问题 -
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着 Javascript 中的内部函数存储对位于同一范围内的所有变量的引用。即在这种情况下,fooinner 是否存储变量a 和b 的引用。
我正在尝试学习 JS 并且关于 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 上都有很多很好的解释。
但无需详细说明,当你的内部函数被解析时,ECMAscript 解释器在内部设置了一个到外部函数的链接(我们分别fooinner
称其为Activation Object和Lexical Environment Record)。