闭包的概念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);
};
}
}