Skip to content

Latest commit

 

History

History
58 lines (45 loc) · 1.09 KB

3.5.2-使用闭包.md

File metadata and controls

58 lines (45 loc) · 1.09 KB

闭包的几个例子:

function complement(PRED) {
  return function() {
    return !PRED.apply(null, arguments);
  }
}

function isEven(n) {
  return (n%2) === 0;
}

var isOdd = complement(isEven);

isOdd(2); // => false
isOdd(13);

变量的捕获发生在创建闭包的时候,isOdd不会察觉isEven。

另外一个例子:

function showObject(OBJ) {
  return function() {
    return OBJ;
  }
}

var o = {1 : 1};
var showO = showObject(o);
showO(); // => Object {1:1}

o的引用同时存在于闭包内部和外部的情况,修改o会有什么效果?

o.newField = 10;
showO(); // => Object {1: 1, newField: 10}

作为私有变量的o被可能意外修改,为了避免,需要把捕获变量私有:

var foo = (function() {
  var PRIVATE = 1;
  
  return {
    inc: function(n) {
       return PRIVATE += n;
    }
  }
})();

foo.inc(1); // => 2

在这个例子里,PRVATE是inc闭包的捕获变量。 closure1