闭包
概念
闭包指的就是那些能够访问独立的变量的函数!
闭包要解决的问题
函数中声明的变量不能被函数外部直接使用
闭包的基本模型
1
2
3
4
5
6
7
|
function (){
var data =
"";
function inner(){
}
return inner;
}
|
使用闭包设置和获取变量的值
1
2
3
4
5
6
7
8
9
10
11
12
|
function (){
var data =
"";
var obj = {
setData:
function(value){
data = value;
},
getData:
function(){
return data;
}
}
return obj;
}
|
闭包的原理
就是作用域的访问规则!
闭包的作用
- 给函数提供一个私有的变量
- 保护变量,给变量的设置提供专有的渠道,在这个渠道中可以添加一些校验的逻辑
闭包的应用
- for循环中注册点击事件的问题
- for循环中setTimeout的问题
缓存
- 浏览器缓存
- CDN
- 硬件缓存
缓存封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function createCache(){
var cache = {};
var keys = [];
return
function(key, value){
if(value){
cache[key] = value;
if(keys.push(key) >
20){
delete[keys.shift()];
}
return cache[key];
}
}
}
|
jQuery缓存源码
1
2
3
4
5
6
7
8
9
|
function createCache(){
var keys = [];
function cache(key, value){
if(keys.push(key +
" ") >
20){
delete cache[keys.shift()];
}
return (cache[key +
" "] = value);
}
}
|
递归实现的斐波那契数列存在的性能问题
由于存在大量的重复的计算,所以导致在40多之后,就算不出来了
解决方案
- 提供一个缓存,用这个缓存来存储计算出来的数据
- 每次在计算的时候,首先先从缓存中去获取,如果有,就直接返回
- 如果没有,就通过递归的方式去计算
- 计算出来之后,一定要记着保存到缓存中去,以便下次使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
function createCache(){
var cache = {};
var keys = [];
return
function(key, value){
if(value){
cache[key] = value;
if(keys.push(key) >
20){
delete[keys.shift()];
}
}
else{
return cache[key];
}
}
}
var cache = createCache();
function fib(n){
var num = cache(n);
if(!num){
if(n ==
1 || n ==
2){
num =
1;
}
else{
num = fib(n -
1) + fib(n -
2);
}
cache(n, num);
}
return num;
}
|