闭包

2017-07-02  本文已影响0人  Liberty寒风

使变量的值始终保持在内存中

function f1(){
  var n=999;
  function f2(){
    alert(n++);
  }
  return f2;
}
var result=f1();
result(); // 999
result(); // 1000

我们在外部调用result函数,可以不断增加内部的n值,实际上函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

原因: f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

用闭包模拟私有方法

var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }   
})();
alert(Counter.value()); /* 提示 0 */
Counter.increment();
Counter.increment();
alert(Counter.value()); /* 提示 2 */
Counter.decrement();
alert(Counter.value()); /* 提示 1 */

JavaScript 并不提供原生的支持,但是可以使用闭包模拟私有方法

使用闭包的注意点

上一篇下一篇

猜你喜欢

热点阅读