(本篇适用于对js闭包有一定基础的读者)
使用闭包有以下几大好处:
function A() {
let count = 0
function B() {
count++
console.log(count)
}
}
var C = A(); //通过C这样一个外部变量可以访问到A的内部变量
C(); //1
C(); //2
C(); //3
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];
// 在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都添加到一个Array中返回了。
f1(); // 16
f2(); // 16
f3(); // 16
全部都是16!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量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;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[3];
f1(); //1
f2(); //4
f3(); //9
注意这里用了一个“创建一个匿名函数并立刻执行”的语法:
function handler(){
var ele = document.getElementById("ele");
ele.onclick = function(){
alert(ele.id);
}
闭包会引用包含函数的整个活动对象,即是闭包不直接引用ele,活动对象依然会对其保存一个引用,那么设置null就可以断开保存的引用,释放内存。代码如下:
function handler(){
var ele = document.getElementById("ele");
var id = ele.id;
ele.onclick = function(){
alert(id); } ele = null;
}
console.log('cache', cache);
4、js闭包缓存机制:
const getList = (function() {
let data = {};
const getData = () => {
return new Promise((resolve, reject) => {
let packageOptions = { url: '/your/api', params: { normal: 1 },
success: function (rsp) {
data = rsp.data; resolve();
}
};
ajax(packageOptions);
})
}
// 闭包存储data
const result = async function (type) {
if (JONS.stringify(data) === '{}') {
await getData();
return data;
} else {
return data;
}
}
return result;
})();
// 第一次调用通过api请求数据
getList().then(res => {
console.log(res);
// 第二次调用则直接拿取缓存数据
getList().then(res => { console.log(res);
})
})
本文仅作为个人记忆点存储
参考文章: