1 闭包
闭包就是说,能够读取其他函数内部变量的函数。
其实这句话我不是很明白,因为我觉得闭包的作用是:
- 延迟函数执行
- 模拟私有变量
根据第二点的描述,应该是阻止其他东西访问自身私有成员,到了这怎么变成读取其他函数内部变量了?反其道而行之?
不管定义了,看看最经典的这个例子
(延迟执行):
function count() { var arr = []; for (var i=1; i<=3; i++) { arr.push(function () { return i * i; }); } return arr; } var results = count(); var f1 = results[0]; var f2 = results[1]; var f3 = results[2];
在函数内一个数组arr,用于保存平方的匿名函数。在匿名函数里,用到了前面的局部变量i,这里注意,这个匿名函数从始至终都没有执行过,然而又用到了i,因此说i被捕获了,不能释放。
接下来f1 ~ f3被赋值了三个匿名函数。分别用来计算1、2、3的平方。
f1(); // 16 f2(); // 16 f3(); // 16
然后依次执行f1 ~ f3。结果居然都是16,而不是1、4、9。可以这么理解,匿名函数要用到i,因此i被捕获了,不能释放,真正到执行的时候,才用到了i,这时候的i已经是4了。因此结果是16。
因此,可以让他不要只是捕获,而是捕获顺便就执行一下。
function count() { var arr = []; for (var i = 1; i <= 3; i++) { arr.push( (function (n) { return function () { return n * n; } })(i) ); } return arr; }
这里利用了直接执行(function () {}) ();
(私有变量)
1 function createCounter(initial) { 2 var x = initial || 0; 3 return { 4 add: function () { 5 return ++ x; 6 } 7 } 8 } 9 10 var counter1 = createCounter(); 11 var counter2 = createCounter(10); 12 counter1.add(); 13 counter1.add(); 14 counter2.add(); 15 counter2.add(); 16 console.log(counter1.add()); // 3 17 console.log(counter2.add()); // 13
其中,变量x被隐藏了,外界无法访问。