閉包

什么是閉包?

  • 可以訪問函數(shù)內(nèi)部變量的函數(shù)
//首先我們要明白這段代碼
//外面的a是跟函數(shù)作用域里邊的a是不同的
//num(a)只是把外面的a的值賦值給函數(shù)里面的a
//函數(shù)里面聲明的東西跟外面的一點(diǎn)關(guān)系都沒有。

var a=99
function num(a){
    ++a
    console.log(a)
}
num(a)//100
console.log(a)//99
var arr=[];
    for(var i=0;i<2;i++){
        arr[i]=function(){
            console.log(i)
        }
    }
arr[1]()//都是會(huì)打印出2
arr[0]()//2

//首先明白function()里面的東西是什么時(shí)候會(huì)執(zhí)行。
//實(shí)在函數(shù)被調(diào)用的時(shí)候才會(huì)執(zhí)行,上面代碼在函數(shù)執(zhí)行的時(shí)候,已經(jīng)遍歷完畢,i==5,所以,每次打印的都是5

改裝下

var arr=[];
for(var i=0;i<2;i++){
    function num(i){
        arr[i]=function(){
            console.log(i)
        }
    }
    num(i)
}
arr[0]()//0
arr[1]()//1

上面的代碼可以拆分為
當(dāng)i=0的時(shí)候:
function num(i){
        //i=0 寫在形參的I其實(shí)就是在函數(shù)內(nèi)部聲明了一個(gè)變量==var i
        arr[0]=function(){
        console.log(0) //我獲取的是函數(shù)里面的i
    }
}
num(0)
//參考例子1,我們是吧遍歷的i的值賦給了函數(shù)里面的i,
//那么我們外面的調(diào)用arr[0]()的時(shí)候,
自然里面的就會(huì)按照函數(shù)的作用域,
上去找i打印,
找到的是num函數(shù)里面的i,
所以就打印出0;


如此類推
當(dāng)i=1時(shí):
function num(i){
        //i=0 寫在形參的I其實(shí)就是在函數(shù)內(nèi)部聲明了一個(gè)變量==var i
        arr[1]=function(){
        console.log(1) //我獲取的是函數(shù)里面的i
    }
}
num(1)

最后可以改為:
    var arr=[];
    for(var i=0;i<2;i++){
        !function (i){
            arr[i]=function(){
                console.log(i)
            }
        }(i)
    }
    arr[0]()
    arr[1]()

第二種方法

var arr=[];
    for(var i=0;i<2;i++){
        arr[i]=function(i){
            return function (){
                console.log(i)
            }
        }(i)
    }
    arr[0]()//0
    arr[1]()//1

//拆一下 也可以寫為:
var arr=[];
    for(var i=0;i<2;i++){
        arr[i]=fn(i)
        function fn(i){
            return function (){
                console.log(i)
            }
        }
    }
    arr[0]()//0
    arr[1]()//1

閉包說明很多道理,更重要的是理解好函數(shù)的作用域問題。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 5,716評論 16 88
  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn),也是它的特色,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一、變量...
    zock閱讀 1,118評論 2 6
  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn),也是它的特色,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一、變量...
    zouCode閱讀 1,361評論 0 13
  • 特別說明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 555評論 0 0
  • 閉包: 官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 711評論 0 5

友情鏈接更多精彩內(nèi)容