<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        理解和運用JavaScript的閉包機制_基礎知識

        來源:懂視網 責編:小采 時間:2020-11-27 21:42:02
        文檔

        理解和運用JavaScript的閉包機制_基礎知識

        理解和運用JavaScript的閉包機制_基礎知識:偉大的愛因斯坦同志說過:如果你無法向一個 6 歲小孩解釋清楚某問題,那說明你自己都沒整明白。然而,當我向一個 27 歲的朋友解釋什么是閉包時,卻徹底失敗了。 這原本是國外某哥們兒在 Stack Overflow 上對 JavaScript 閉包所提出的問題。不過既然此問
        推薦度:
        導讀理解和運用JavaScript的閉包機制_基礎知識:偉大的愛因斯坦同志說過:如果你無法向一個 6 歲小孩解釋清楚某問題,那說明你自己都沒整明白。然而,當我向一個 27 歲的朋友解釋什么是閉包時,卻徹底失敗了。 這原本是國外某哥們兒在 Stack Overflow 上對 JavaScript 閉包所提出的問題。不過既然此問

        偉大的愛因斯坦同志說過:“如果你無法向一個 6 歲小孩解釋清楚某問題,那說明你自己都沒整明白”。然而,當我向一個 27 歲的朋友解釋什么是閉包時,卻徹底失敗了。

        這原本是國外某哥們兒在 Stack Overflow 上對 JavaScript 閉包所提出的問題。不過既然此問題是在 Stack Overflow 提出的,當然也會有很多高手出來解答,其中有些回答確實是經典,如下面這個:

        如果在一個外部函數中再定義一個內部函數,即函數嵌套函數,那么內部函數也可以訪問外部函數中的變量:

        此段代碼可以正確執行,并返回結果:16,因為 bar 能訪問外部函數的變量 tmp, 同時也能訪問外部函數 foo 的參數 x。但以上示例不是閉包!

        要實現閉包的話,需要將內部函數作為外部函數的返回值返回,內部函數在返回前,會將所有已訪問過的外部函數中的變量在內存中鎖定,也就是說,這些變量將常駐 bar 的內存中,不會被垃圾回收器回收,如下:

        上述代碼中,第一次執行 bar 時,仍會返回結果:16,因為 bar 仍然可以訪問 x 及 tmp,盡管它已經不直接存在于 foo 的作用域內。那么既然 tmp 被鎖定在 bar 的閉包里,那么每次執行 bar 的時候,tmp 都會自增一次,所以第二次和第三次執行 bar 時,分別返回 17 和 18。

        此示例中,x 僅僅是個純粹的數值,當 foo 被調用時,數值 x 就會作為參數被拷貝至 foo 內。

        但是 JavaScript 處理對象的時候,使用的總是引用,如果用一個對象作為參數來調用 foo,那么 foo 中傳入的實際上是原始對象的引用,所以這個原始對象也相當于被閉包了,如下:

        和期望的一樣,每次執行 bar(10) 時,不但 tmp 自增了,x.memb 也自增了,因為函數體內的 x 和函數體外的 age 引用的是同一個對象。

        via http://stackoverflow.com/questions/111102/how-do-javascript-closures-work

        補充:通過以上示例,應該能比較清楚的理解閉包了。如果覺得自己理解了,可以試著猜猜下面這段代碼的執行結果:

        實際使用的時候,閉包可以創建出非常優雅的設計,允許對funarg上定義的多種計算方式進行定制。如下就是數組排序的例子,它接受一個排序條件函數作為參數:

        同樣的例子還有,數組的map方法是根據函數中定義的條件將原數組映射到一個新的數組中:

        使用函數式參數,可以很方便的實現一個搜索方法,并且可以支持無限制的搜索條件:

        還有應用函數,比如常見的forEach方法,將函數應用到每個數組元素:

        順便提下,函數對象的 apply 和 call方法,在函數式編程中也可以用作應用函數。 這里,我們將它們看作是應用函數 —— 應用到參數中的函數(在apply中是參數列表,在call中是獨立的參數):

        閉包還有另外一個非常重要的應用 —— 延遲調用:

        還可以創建封裝的作用域來隱藏輔助對象:

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        理解和運用JavaScript的閉包機制_基礎知識

        理解和運用JavaScript的閉包機制_基礎知識:偉大的愛因斯坦同志說過:如果你無法向一個 6 歲小孩解釋清楚某問題,那說明你自己都沒整明白。然而,當我向一個 27 歲的朋友解釋什么是閉包時,卻徹底失敗了。 這原本是國外某哥們兒在 Stack Overflow 上對 JavaScript 閉包所提出的問題。不過既然此問
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产精品成人免费观看| 99久在线国内在线播放免费观看 | 在线观看永久免费视频网站| 国产亚洲精品免费| 好看的电影网站亚洲一区| 免费A级毛片无码A∨免费| 亚洲aⅴ无码专区在线观看春色| 日韩大片免费观看视频播放| 亚洲av中文无码乱人伦在线r▽ | 亚洲av日韩av欧v在线天堂| 久久免费高清视频| 亚洲成av人无码亚洲成av人| 亚洲国产综合无码一区 | 亚洲第一页综合图片自拍| 亚洲无砖砖区免费| 永久免费精品影视网站| 亚洲精品在线视频观看| 久久精品国产这里是免费| 亚洲日韩国产AV无码无码精品| 亚洲人成网7777777国产| 亚洲免费综合色在线视频| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲国产精品免费观看| 国产免费黄色无码视频| 亚洲综合av一区二区三区| 人人狠狠综合久久亚洲婷婷| 午夜小视频免费观看| 在线免费中文字幕| 国产精品免费观看视频| 亚洲а∨精品天堂在线| 亚洲色偷偷偷网站色偷一区| 国外亚洲成AV人片在线观看| 天天看免费高清影视| 97精品免费视频| 国产区在线免费观看| 国产精品亚洲片在线花蝴蝶| 国产亚洲精品成人AA片| 亚洲伊人久久大香线蕉苏妲己| 亚洲精品无码你懂的网站| 日本一道本高清免费| 成人无码区免费视频观看 |