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

資訊專欄INFORMATION COLUMN

再談Js閉包

cuieney / 2465人閱讀

摘要:不知不覺距離上一篇閉包文章已經(jīng)過了個月了,現(xiàn)在的理解對比之前要健壯的多,再次總結(jié)下花生理解的閉包。這一段代碼很重要,理解這一段代碼基本上就可以說理解閉包了。

不知不覺距離上一篇閉包文章已經(jīng)過了8個月了,現(xiàn)在的理解對比之前要健壯的多,再次總結(jié)下花生理解的閉包。

閉包實際上就是子作用域讀取父作用域的變量,這本來很合理也很簡單,但是關(guān)鍵點在于這個讀取是動態(tài)的,請看下面的例子:

for(var i=0 ;i<3 ;i++){
    setTimeout(function(){
        console.log(i);
    });
};
// 輸出 3 3 3

結(jié)果并不是期望的0 1 2,因為是動態(tài)的讀取i,因此如果你在下文改變變量i也依舊會影響到輸出讀取i。

傳統(tǒng)的解決方案是構(gòu)建閉包,是最有效也是兼容性最好的方法

for(var i=0 ;i<3 ;i++){
    (function(num){
        setTimeout(function(){
            console.log(num);
        });
    })(i);
};
// 輸出 0 1 2

這么做是十分有效的,為每一個閉包多帶帶創(chuàng)建一個作用域,也是下面要說的其他解決方案的基礎(chǔ)。

這一段代碼很重要,理解這一段代碼基本上就可以說理解閉包了。

實際上,大多數(shù)情況我們并不是想單純是使用for循環(huán),for循環(huán)的一個很常見的用處是遍歷數(shù)組。

var arr =["a" ,"b" ,"c"];
for(var i=0 ;i

因為是動態(tài)讀取,所以輸出undefined很正常。可以使用上面的構(gòu)建一個自執(zhí)行函數(shù)來解決,但還有一個更方便的解決方案,也是實際開發(fā)中經(jīng)常用到的。

["a" ,"b" ,"c"].forEach(function(item){
    setTimeout(function(){
        console.log(item);
    });
});
// 輸出 a b c

利用Array原生的forEach可以更好的實現(xiàn),而且也符合語義,這個是花生最推薦的用法。

如果瀏覽器較新支持ES5,F(xiàn)unction還提供一個bind方法來綁定參數(shù)

for(var i=0 ;i<3 ;i++){
    setTimeout(console.log.bind(null ,i));
};
// 輸出 0 1 2

Function.bind具體的語法與兼容性可以參考MDN。

還有其他的“歪門邪道”的解決方案,比如利用閉包讀取到父作用域的集合,在集合里尋找“自己”,或者是利用js的引用傳遞等等。

實際上,利用ES5的bind方法和Array的forEach就已經(jīng)可以解決所有問題了,所以在實際開發(fā)中應(yīng)該避免第一種構(gòu)建閉包的解決方案。

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

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

相關(guān)文章

  • 再談閉包-詞法作用域

    摘要:權(quán)威指南第六版關(guān)于閉包的說明采用詞法作用域,也就是說函數(shù)的執(zhí)行依賴于變量的作用域,這個作用域是在函數(shù)定義時決定的,而不是函數(shù)調(diào)用時決定的。閉包這個術(shù)語的來源指函數(shù)變量可以被隱藏于作用域鏈之內(nèi),因此看起來是函數(shù)將變量包裹了起來。 最近打算換工作,所以參加了幾次面試(國內(nèi)比較知名的幾家互聯(lián)網(wǎng)公司)。在面試的過程中每當(dāng)被問起閉包,我都會說閉包是作用域的問題?令人驚訝的是幾乎無一例外的當(dāng)我提到...

    Ku_Andrew 評論0 收藏0
  • JS程序

    摘要:設(shè)計模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計模式必須要先搞懂面向?qū)ο缶幊?,否則只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評論0 收藏0
  • JS筆記

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細介紹 HTT...

    rottengeek 評論0 收藏0
  • JavaScript系列——JavaScript同步、異步、回調(diào)執(zhí)行順序之經(jīng)典閉包setTimeou

    摘要:同步異步回調(diào)傻傻分不清楚。分割線上面主要講了同步和回調(diào)執(zhí)行順序的問題,接著我就舉一個包含同步異步回調(diào)的例子。同步優(yōu)先回調(diào)內(nèi)部有個,第二個是一個回調(diào)回調(diào)墊底。異步也,輪到回調(diào)的孩子們回調(diào),出來執(zhí)行了。 同步、異步、回調(diào)?傻傻分不清楚。 大家注意了,教大家一道口訣: 同步優(yōu)先、異步靠邊、回調(diào)墊底(讀起來不順) 用公式表達就是: 同步 => 異步 => 回調(diào) 這口訣有什么用呢?用來對付面試的...

    lewif 評論0 收藏0

發(fā)表評論

0條評論

cuieney

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<