鍍金池/ 問答/HTML/ setTimeout循環(huán)傳入第三個參數(shù),真的是閉包的實現(xiàn)嗎?

setTimeout循環(huán)傳入第三個參數(shù),真的是閉包的實現(xiàn)嗎?

function fn1(){

for(var i=0;i<4;i++){
    var tc=setTimeout(function(i){
        console.log(i);
        clearTimeout(tc)
    },10,i);
}

}
fn1()

為什么會說這個考察了閉包的理解呢?
哪部分是閉包?
函數(shù)的外部調(diào)用函數(shù)內(nèi)部的變量,可是這里的閉包怎么體現(xiàn)這個概念呢?

回答
編輯回答
青瓷

本來寫法:

function fn1(){

    for(var i=0;i<4;i++){
        var tc=setTimeout(function(){
            console.log(i);
            clearTimeout(tc)
        },10);
    }
}
fn1()

定時器回調(diào)函數(shù)里的ifn1函數(shù)里for循環(huán)的i。fn1函數(shù)執(zhí)行完畢,定時器回調(diào)函數(shù)還保留著對fn1函數(shù)的變量對象的引用。
結(jié)果:一次性輸出4。


你問題里的寫法:
每次 for 循環(huán)的i作為參數(shù)實時傳給了定時器回調(diào)函數(shù),這樣就沒有閉包什么事了~~

2017年4月11日 23:30
編輯回答
不歸路

樓主,我簡單給你概述下,閉包其實就是一級函數(shù)調(diào)用的 二級函數(shù),二級函數(shù)訪問一級函數(shù)中的變量 我喜歡把這個過程叫做閉包。 當(dāng)然網(wǎng)上也有很多官方的理解,你也可以去參考,但我感覺我這個相對來說好理解一點。 首先一級函數(shù)為fn1 那么二級函數(shù)就是這個超時調(diào)用了,

2017年2月21日 06:34
編輯回答
不歸路

閉包指的是clearTimeout(tc),tc不在詞法作用域內(nèi)。

2018年6月26日 13:39