成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

javascript 閉包

xiangzhihong / 945人閱讀

摘要:現(xiàn)在可以畫(huà)一個(gè)基本的閉包出來(lái)了三種傳遞方法分開(kāi)看,你可以的。二循環(huán)中的閉包說(shuō)到循環(huán)閉包就要掏出大家耳熟能詳?shù)睦踝恿?。外部包裝函數(shù)返回值至少引用一個(gè)內(nèi)部函數(shù)創(chuàng)建包裝函數(shù)內(nèi)部作用域閉包。

閉包 一、閉包是什么?

將一個(gè) 詞法作用域 中的 內(nèi)部函數(shù) 作為一個(gè) 一級(jí)值類(lèi)型 到處傳遞,就形成了閉包。

怎么去理解呢?這里要敲黑板劃重點(diǎn)了,上面的概念性文字介紹了三個(gè)點(diǎn):

詞法作用域(函數(shù))

內(nèi)部函數(shù)

一級(jí)值類(lèi)型傳遞

1、先說(shuō)詞法作用域

形成一個(gè)作用域最常見(jiàn)的就是函數(shù)了,函數(shù)內(nèi)部會(huì)形成一個(gè)內(nèi)部作用域,然后還有 let 、const 以及像 try/catch 結(jié)構(gòu)中的 catch 分句形成的塊作用域。

let 就是為其聲明的變量隱式劫持了所在的塊作用域,這個(gè)在后面講 let 和閉包的時(shí)候會(huì)詳細(xì)說(shuō)明 let 和閉包結(jié)合的用法。

通過(guò)了解可以知道,這里的作用域其實(shí)就是函數(shù)的內(nèi)部作用域。

2、內(nèi)部函數(shù)

內(nèi)部函數(shù)不用介紹了吧,在詞法作用域中定義的函數(shù),傳遞后具有涵蓋自身所在作用域的閉包。

3、一級(jí)值類(lèi)型傳遞

值類(lèi)型傳遞方式有很多種啊,函數(shù)里面的一級(jí)值傳遞無(wú)非就是:返回值return )、賦值( 賦值給外部變量 )、參數(shù)傳遞( 作為參數(shù)傳遞給外部函數(shù) )。

現(xiàn)在可以畫(huà)一個(gè)基本的閉包出來(lái)了:

//三種傳遞方法①②③分開(kāi)看,你可以的。

var fn;                //定義全局變量,用于內(nèi)部賦值        ---②
function foo() {
    var a = 2;
    function bar() {
        console.log(a);
    };
    return bar;        //返回值        ---①
    fn = bar;        //賦值        ---②
    baz(bar);        //參數(shù)傳遞    ---③
};

//定義外部函數(shù),用于使用內(nèi)部分配給全局變量的函數(shù)    ---②
function cat() {
    fn();
};

//定義外部函數(shù),用于內(nèi)部參數(shù)傳遞        ---③
function baz(func) {
    func();
};

foo();        //2       ---①
cat();        //2        ---②
baz();        //2        ---③

再來(lái)一例:

function wait(message) {
    setTimeout(function timer(){
        console.log(message);
    },1000);
}
wait("Hi Baby");

解析一下,按照我們前面的思路可以貫穿下來(lái):

首先 wait(..) 里面的作用域,作用域內(nèi)部的 timer(..)函數(shù),再將內(nèi)部函數(shù) timer(..) 傳遞給內(nèi)置工具函數(shù) setTimeout(..),setTimeout(...)有參數(shù)引用( 也就是我們傳遞的 timer(...) ),然后調(diào)用它。

整個(gè)過(guò)程行云流水,然后詞法作用域在這個(gè)過(guò)程中保持完璧之身。OK!

二、循環(huán)中的閉包

說(shuō)到循環(huán)閉包就要掏出大家耳熟能詳?shù)睦踝恿恕?/p>

for(var i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i);
    },i*1000)
}

666!好!輸出了幾個(gè)6,老鐵有點(diǎn)懵逼,不知應(yīng)該扎心還是雙擊666。

為何?

你大爺還是你大爺,即使你在每次迭代都定義了函數(shù),但是都在共享全局作用域中,i 還是這個(gè) i

那要怎么解決?

這時(shí)候在每個(gè)迭代的時(shí)候加上一個(gè)閉包作用域,并且你得把這個(gè) i 大爺放進(jìn)作用域中。

//放法可以是傳參①,可以是賦值②

for(var i = 1; i <= 5; i++) {
    //這里先搞一個(gè)閉包作用域,派出我們的 IIFE
    (function(j) {        // ---①
        setTimeout(function timer() {
            console.log(j);
        },j*1000)
    })(i);        // ---①

    (function() {    
        var j = i;        // ---②
        setTimeout(function timer() {
            console.log(j);
        },j*1000)
    })();    
}

上面這個(gè)是用了閉包作用域,每次迭代都生成一個(gè)新的作用域,來(lái)封閉內(nèi)部變量。

說(shuō)到這里,前面提到的 let 應(yīng)該還有人記得,let 干嘛用的,不就是劫持變量形成塊作用域嗎? 放在這里不是恰到好處? 來(lái)一發(fā)。

for(let i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i)
    },i*1000)
}

直接在定義 i 大爺?shù)牡胤骄?"綁架" 了他。

或者,你也可以麻煩一點(diǎn),先讓他上迭代車(chē),上車(chē)之后再 let 定義一個(gè)變量把 i 大爺賦給他,兩種都行,簡(jiǎn)單點(diǎn)好。

三、總結(jié)一下閉包應(yīng)用

定時(shí)器、事件監(jiān)聽(tīng)器、Ajax請(qǐng)求、跨窗口通信、Web Workers 或者其他的異步(或同步)任務(wù)中(balabala~~~~),只要使用了回調(diào)函數(shù),就是在使用閉包。

還有一處重要的 模塊。

模塊的兩個(gè)重要特征:

有外部包裝函數(shù)(創(chuàng)建內(nèi)部作用域)且需要被調(diào)用。

外部包裝函數(shù)返回值至少引用一個(gè)內(nèi)部函數(shù)(創(chuàng)建包裝函數(shù)內(nèi)部作用域閉包)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103488.html

相關(guān)文章

  • Javascript閉包入門(mén)(譯文)

    摘要:也許最好的理解是閉包總是在進(jìn)入某個(gè)函數(shù)的時(shí)候被創(chuàng)建,而局部變量是被加入到這個(gè)閉包中。在函數(shù)內(nèi)部的函數(shù)的內(nèi)部聲明函數(shù)是可以的可以獲得不止一個(gè)層級(jí)的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請(qǐng)自行忽略。 譯者 :文章寫(xiě)在2006年,可直到翻譯的21小時(shí)之前作者還在完善這篇文章,在Stackoverflow的How do Java...

    Fourierr 評(píng)論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在??上У氖?,并沒(méi)有提供相關(guān)的成員和方法來(lái)訪(fǎng)問(wèn)閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門(mén)文章。Javascript中有幾個(gè)非常重要的語(yǔ)言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語(yǔ)言C/C++的程序員來(lái)說(shuō)是一個(gè)新的語(yǔ)言特性。本文將...

    dayday_up 評(píng)論0 收藏0
  • JavaScript閉包,只學(xué)這篇就夠了

    摘要:當(dāng)在中調(diào)用匿名函數(shù)時(shí),它們用的都是同一個(gè)閉包,而且在這個(gè)閉包中使用了和的當(dāng)前值的值為因?yàn)檠h(huán)已經(jīng)結(jié)束,的值為。最好將閉包當(dāng)作是一個(gè)函數(shù)的入口創(chuàng)建的,而局部變量是被添加進(jìn)這個(gè)閉包的。 閉包不是魔法 這篇文章使用一些簡(jiǎn)單的代碼例子來(lái)解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...

    CoderBear 評(píng)論0 收藏0
  • JavaScript深入之閉包

    摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...

    caige 評(píng)論0 收藏0
  • 還擔(dān)心面試官問(wèn)閉包?

    摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪(fǎng)問(wèn)所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說(shuō)筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記](méi) JavaScript 閉包

    摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過(guò)原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來(lái)說(shuō),一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷(xiāo)毀。所以此時(shí),的作用域鏈雖然銷(xiāo)毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...

    sunsmell 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<