闭包的概念Closure:作用域
引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在;
即使已经离开了创造它的环境也不例外。
所以,闭包是由函数和其他相关的引用环境组合而成,实现信息驻留;
信息的保存,引用在,空间不销毁
简单的使用
var Person = function () { var count = 0; return function () { return count++; }; }; var p = Person() console.log(p()); // 0 console.log(p()); // 1 console.log(p()); // 2
闭包的应用
var buttons = [{name: 'n1'}, {name: 'n2'}, {name: 'n3'}] function bind() { for (var i = 0; i < buttons.length; i++) { // 定义一个立即执行函数,行成闭包 (function (num) { buttons[i].func = function () { console.log(num); }; })(i); } } bind(); buttons[0].func(); // 0 buttons[1].func(); // 1 buttons[2].func(); // 2
闭包缺点:
闭包导致内存驻留,如果是大量对象的闭包环境需要注意内存消耗
ES6中使用let定义局部变量也可以实现输出0 1 2
function bind() { for (let i = 0; i < buttons.length; i++) { buttons[i].func = function () { console.log(i); }; } }