閉包:簡單的說就是一個函數內嵌套另外一個函數。
簡單的閉包實例:
第一:function a(){
var c=1
var b=function(){
c=3
console.log(c)//打印的值3
}()
console.log(c)//打印的值3
}
a()
第二:function a(){
var c=1
var b=function(){
var c=3
console.log(c)//打印的值3
}()
console.log(c)//打印的值1
}
a()
上面兩種狀況打印的值則是不同的
爲何要使用閉包呢:
問到此處的時候,咱們想到的就是做用域的問題了,做用域分爲全局做用於和局部做用域,咱們通常能夠從內部訪問到外部的變量,但不能從外部訪問內部的變量,這時候咱們就能夠用閉包,閉包就是間接的幫咱們訪問函數內部的變量
簡單的閉包實例:
function a(){
var b=1
function c(){
console.log(++b)
}
return c
}
var d=a()
d()//2
------------------------------適用場景-------------------------------
for循環中套用延時器
for(var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
});
}
console.log('a');
打印的順序是:先是a,而後就是五個5
(解決打印5不打印0,1,2,3,4,5的方案:在for循環中套用匿名函數)
第一種方案:(使用閉包解決)
for(var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function () {
console.log(i);
});
})(i)
}
console.log('a');
此時打印的順序是:先是a,而後0,1,2,3,4,5
第二種方案:(將var改用Es6的let)
for(let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
});
}
console.log('a');
此時打印的順序是:先是a,而後0,1,2,3,4,5 複製代碼