使用闭包的举例
使用闭包的举例
-> 缓存
闭包允许函数带有一个缓存结构, 也就是说只有该函数可以使用的一个私有的独立的内存空间
用法
var func = (function () {
// 内存私有
return function () {
// 函数体
};
})();
例如, 在实际开发中会有频繁的获取元素的行为. 获取元素最简单的处理形式就是使用选择器.
在 h5 中, 引入了 一个新的 方法 document.querySelectorAll
var $ = function ( selector ) {
return document.querySelectorAll( selector );
};
在完成一个页面应用的时候, 一般会频繁的对元素进行获取操作. 为了提高效率我们可以将元素缓存.
$( ... ).事件(function () {
$( this )
$( ... )
})
缓存代码
var $ = (function () {
var cache = {};
return function ( selector ) {
// 首先判断缓存中有没有, 有的就直接使用缓存中的, 如果没有就再来获取
var nodeList;
if ( cache[ selector ] ) {
// 有
nodeList = cache[ selector ];
} else {
// 没有
nodeList = document.querySelectorAll( selector );
cache[ selector ] = nodeList; // 在 缓存中存起来
}
return nodeList;
};
})();
为了更高效的时候, 缓存需要一个容量. 所以给定一个 length 属性, 缓存中存储数据如果超过了
这个 length 那么就将最早加入的数据删除.
在私有空间中引入一个数组, 用于存储 键,
1> 保存顺序
2> 可以获得长度
var length = 3;
var $ = (function () {
var cacheKeys = [];
var cache = {};
return function ( selector ) {
// 首先判断缓存中有没有, 有的就直接使用缓存中的, 如果没有就再来获取
var nodeList;
if ( cache[ selector ] ) {
// 有
nodeList = cache[ selector ];
} else {
// 没有
nodeList = document.querySelectorAll( selector );
// 存储之前需要判断长度
if ( cacheKeys.length >= length ) {
// 需要删除
var key = cacheKeys.shift();
delete cache[ key ];
}
cacheKeys.push( selector );
cache[ selector ] = nodeList; // 在 缓存中存起来
}
return nodeList;
};
})();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>div</div>
<p>p</p>
<span>span</span>
<b>b</b>
<div>div</div>
<p>p</p>
<span>span</span>
<b>b</b>
<div>div</div>
<p>p</p>
<span>span</span>
<b>b</b>
</body>
<script>
var length = 3;
var $ = (function () {
var cacheKeys = [];
var cache = {};
return function ( selector ) {
// 首先判断缓存中有没有, 有的就直接使用缓存中的, 如果没有就再来获取
var nodeList;
if ( cache[ selector ] ) {
// 有
nodeList = cache[ selector ];
} else {
// 没有
nodeList = [].slice.call( document.querySelectorAll( selector ) );
// 将 伪数组 NodeList 转换成 真数组 Array, 为了在后面调用 forEach 方法
// 存储之前需要判断长度
if ( cacheKeys.length >= length ) {
// 需要删除
var key = cacheKeys.shift();
delete cache[ key ];
}
cacheKeys.push( selector );
cache[ selector ] = nodeList; // 在 缓存中存起来
}
return nodeList;
};
})();
$( 'div' ).forEach( function ( v ) {
v.style.border = '1px solid red';
});
// ES6 里的 箭头函数写法
$( 'p' ).forEach( v => v.style.border = '1px dashed blue' );
$( 'span' ).forEach( v=> v.style.backgroundColor = 'yellow' );
$( 'b' ).forEach( v => v.style.color = 'pink' );
</script>
</html>

浙公网安备 33010602011771号