闭包
函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。
由于闭包的概念比较抽象,所以本篇幅会有较多的主观理解。
1. 什么是闭包
var fn = function() {
var number = ;
};
fn();
console.log(number);
这个例子是访问不到 number
的,想访问到就可以借助闭包的特性。
var fn = function() {
var number = ;
return function() {
number++;
console.log(number);
};
};
var increment = fn();
increment();
increment();
increment();
2. 闭包的应用
2.1 模拟私有属性
var counter = (function() {
var count = ;
return {
increment: function() {
count++;
return count;
},
zero: function() {
count = ;
return count;
},
get value() {
return count;
},
};
})();
counter.increment();
console.log(counter.value); // 输出:1
counter.increment();
console.log(counter.value); // 输出:2
console.log(counter.count); // 输出:undefined
2.2 回调函数几乎都用到了闭包的特性
var fn = function(cb) {
console.log('异步操作开始');
setTimeout(function() {
console.log('异步操作结束');
cb();
}, );
};
var obj = {
flag: false,
};
fn(function() {
obj.flag = true;
console.log(obj);
});
很明显,这里的回调函数就是用到了闭包的特性。
所以闭包其实很常用,结合日常的这些场景能更好的理解闭包。