-
Notifications
You must be signed in to change notification settings - Fork 0
/
闭包的实例
85 lines (73 loc) · 2.76 KB
/
闭包的实例
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
闭包就是可以访问其他函数变量的函数。
闭包的作用:1.正常函数执行完成以后里面的变量会被垃圾回收机制回收掉,而闭包会让作用域里的变量在函数执行完成以后仍然保持没有被垃圾回收机制回收。
2.闭包的第一个用途是使我们在函数外部能够访问到函数内部的变量。通过使用闭包,我们可以通过在外部调用闭包函数,从而在外
部访问到函数内部的变量,可以使用这种方法来创建私有变量。
function foo(){
var name = "kebi";
return function() {
console.log(name);
}
}
var bar = foo();
bar(); //打印出kebi--外部函数访问内部变量
实现一个计数器
function addCount(){
var count =2;
return function(){
count+=2;
console.log(count);
}
}
这里解释一下上边的过程:addCount()实行的时候,返回一个函数,函数是可以创建自己的作用域的,
但是此时返回的这个函数内部需要引用addCount()作用域下的变量count,因此这个count是不能被销毁的,
接下来需要几个计数器我们就定义几个变量就可以,并且他们之间都不会互相影响,每个函数作用域中还会保存
count变量不被销毁,执行不断的累加。
var add2=addCount();
add2();//4
add2();//6
var add3=addCount();
add3();//4
面试题常见
for循环
for(var i=0;i<4;i++){
setTimeout(function(){
console.log(i);
},10);
}
连续输出四个4,因为异步执行后于主线程执行,这个for循环中,每执行一次,就往任务队列里面添加一个任务,
总共循环四次,添加四个任务,四次循环过后i=4,所以打印四个4;
怎样让它输出0,1,2,3呢?
将var改成let。
for(let i=0;i<4;i++){
setTimeout(function(){
console.log(i);
},10);
}
let是es6中声明变量的方式,有自己的作用域块,可以放变量,所以let绑定for循环时,每个i都有自己的值.
在这个for循环中就是满足一次条件向事件队列中添加一个打印i的事件,且每个事件中的i有自己的值
使用闭包修改上面的问题
//这个是通过自执行函数返回一个函数,然后在调用返回的函数去获取自执行函数内部的变量,此为闭包
for(var i=0;i<4;i++){
setTimeout(
function(){
var temp=i;
return function(){
console.log(temp);
};
}()
,300)
}
// 使用闭包实现每隔一秒打印1, 2, 3
for (var i=0; i < 5; i++ ) {
(function(i) {
setTimeout(function() {
console.log(i);
}, i*1000)
})(i);
}
// 使用let块级作用域
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}