摘要:不知不覺距離上一篇閉包文章已經(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 2Function.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
摘要:權(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)我提到...
摘要:設(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ù)組的那些迭代方法~ ...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細介紹 HTT...
摘要:同步異步回調(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) 這口訣有什么用呢?用來對付面試的...
閱讀 2825·2021-10-08 10:04
閱讀 3285·2021-09-10 11:20
閱讀 537·2019-08-30 10:54
閱讀 3334·2019-08-29 17:25
閱讀 2314·2019-08-29 16:24
閱讀 896·2019-08-29 12:26
閱讀 1456·2019-08-23 18:35
閱讀 1948·2019-08-23 17:53