js中的闭包是如何工作的?


爱因斯坦有一个观点:一个东西,如果你不能向一个6岁的孩子解释,说明你对它还不够理解。

对闭包通常的解释是:像下面这样


 function foo(x) {
  var tmp = 3;
  return function (y) {
    alert(x + y + (++tmp));
  }
}
var bar = foo(2); // bar is now a closure.
bar(10);

每次调用bar都会改变foo中tmp的值,
此时bar就是一个闭包。


如果是6岁,想到一个稍通俗的描述:闭包就是一个叼炸天的包子,你拿它沾醋的时候,它可以把同一笼的其他包子也变酸了,这个蒸笼就是一个闭包。

求更好的解释。

closure JavaScript 闭包

actfate 10 years, 11 months ago

闭包可以不回收变量,引用函数内部的变量,防止全局变量

该账户已注销 answered 10 years, 11 months ago

闭包就是一个叼炸天的老鼠屎,你拿它煮汤的时候,它可以把同一锅汤都也变坏了,这锅汤就是一个闭包。

arc.02 answered 10 years, 11 months ago

tmp 变量一直存在在 foo 函数中,不会被垃圾回收掉。

香党御姐控 answered 10 years, 11 months ago

tmp是在foo中声明的,foo执行完毕后,tmp应该消失,但是没有,tmp还在某个地方活着,这就是生命周期,tmp这个外部作用域中的局部变量被foo函数返回的函数对象(bar)封闭了。闭包这个词本就是封闭的意思,tmp的寿命和bar的寿命是相等的,当不再访问bar时,垃圾回收掉后,tmp也终结了。
在函数对象中,将局部变量这一环境封闭起来的结构就称为闭包。

yasdui answered 10 years, 11 months ago

Your Answer