什麼是閉包,爲何使用閉包

閉包:簡單的說就是一個函數內嵌套另外一個函數。
 簡單的閉包實例:
第一: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 複製代碼
相關文章
相關標籤/搜索