国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解JavaScript (5) —— 閉包

longmon / 2801人閱讀

摘要:以上是從作用域的角度對閉包的理解,我們還可以結合執行上下文棧來理解閉包。這就是需要理解閉包的核心內容。即,執行到第行時,全局上下文環境將變為活動狀態,但是上下文環境依然會在執行上下文棧中。

理解了上下文環境、作用域、作用域鏈以及自由變量,我們再來聊聊閉包

我們不急于給出閉包的概念,先從應用閉包的兩種情況 —— 1.函數作為返回值,2.函數作為參數被傳遞 —— 來直觀的認識它。

第一,函數作為返回值
function fn() {
    var max = 10;
    
    return function bar(x) {
        if( x > max ) {
            console.log(x);
        }
    };
}

var f1 = fn();
f1(15);

如上代碼,bar函數作為返回值,賦值給f1變量。執行f1(15)時,用到了fn作用域下的max變量的值。至于如何跨作用域取值,可以參考上一節。

第二,函數作為參數被傳遞
var max = 10,
    fn = function(x) {
        console.log( x > max ? true : false );
    };

(function(f) {
    var max = 100;
    f(20);
})(fn);

如上代碼中,fn函數作為一個參數被傳遞進入另一個函數,賦值給f參數。執行f(20)時,max變量的取值是10,而不是100,所以打印結果是true。

上一節講到自由變量跨作用域取值時,曾經強調過:要去創建這個函數的作用域取值,而不是“父作用域”。理解了這一點,以上兩段代碼中,自由變量如何取值應該比較簡單。

以上是從作用域的角度對閉包的理解,我們還可以結合執行上下文棧來理解閉包。

在前面講執行上下文棧時說到,有些情況下,函數調用完成之后,其執行上下文環境不會接著被銷毀。這就是需要理解閉包的核心內容。

咱們可以拿本文的第一段代碼(稍作修改)來分析一下。

第一步,代碼執行前(預處理階段)生成全局上下文環境,并在執行時對其中的變量進行賦值。此時全局上下文環境是活動狀態。

圖片描述

第二步,執行第17行代碼時,調用fn(),產生fn()執行上下文環境,壓棧,并設置為活動狀態。

第三步,執行完第17行,fn()調用完成。按理說應該銷毀掉fn()的執行上下文環境,但是這里不能這么做。注意,重點來了:因為執行fn()時,返回的是一個函數。函數的特別之處在于可以創建一個獨立的作用域。而正巧合的是,返回的這個函數體中,還有一個自由變量max要引用fn作用域下的fn()上下文環境中的max。因此,這個max不能被銷毀,銷毀了之后bar函數中的max就找不到值了。

因此,這里的fn()上下文環境不能被銷毀,還依然存在與執行上下文棧中。

——即,執行到第18行時,全局上下文環境將變為活動狀態,但是fn()上下文環境依然會在執行上下文棧中。另外,執行完第18行,全局上下文環境中的max被賦值為100。如下圖:

第四步,執行到第20行,執行f1(15),即執行bar(15),創建bar(15)上下文環境,并將其設置為活動狀態。

執行bar(15)時,max是自由變量,需要向創建bar函數的作用域中查找,找到了max的值為10。這個過程在作用域鏈一節已經講過。

這里的重點就在于,創建bar函數是在執行fn()時創建的。fn()早就執行結束了,但是fn()執行上下文環境還存在與棧中,因此bar(15)時,max可以查找到。如果fn()上下文環境銷毀了,那么max就找不到了。

使用閉包會增加內容開銷,現在很明顯了吧!

第五步,執行完20行就是上下文環境的銷毀過程,這里就不再贅述了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91723.html

相關文章

  • 【進階2-2期】JavaScript深入之從作用域鏈理解閉包

    摘要:使用上一篇文章的例子來說明下自由變量進階期深入淺出圖解作用域鏈和閉包訪問外部的今天是今天是其中既不是參數,也不是局部變量,所以是自由變量。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第7天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了解本進階計...

    simpleapples 評論0 收藏0
  • 【進階2-3期】JavaScript深入閉包面試題解

    摘要:閉包面試題解由于作用域鏈機制的影響,閉包只能取得內部函數的最后一個值,這引起的一個副作用就是如果內部函數在一個循環中,那么變量的值始終為最后一個值。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第8天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了...

    alanoddsoff 評論0 收藏0
  • Javascript 深入理解閉包

    摘要:要理解閉包,首先得理解作用域。作用域主要分為兩種全局變量和局部變量。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。但閉包的情況不同簡而言之,閉包就是內部函數和外部函數連接的一座橋梁,大人就是小孩與飯桌上所有菜的小助手。 閉包(closure)是Javascript語言的一個重點,也是難點,對于新手來說,概念過于抽象;而現在書上的大部分解釋都比較含糊,本文將把閉包掰開了、揉碎了...

    Corwien 評論0 收藏0
  • 深入javascript——作用域和閉包

    摘要:注意由于閉包會額外的附帶函數的作用域內部匿名函數攜帶外部函數的作用域,因此,閉包會比其它函數多占用些內存空間,過度的使用可能會導致內存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發中經常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...

    oogh 評論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復雜到不可理解的東西,簡而言之,閉包就是閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在。可惜的是,并沒有提供相關的成員和方法來訪問閉包中的局部變量。 (收藏自 技術狂) 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統靜態語言C/C++的程序員來說是一個新的語言特性。本文將...

    dayday_up 評論0 收藏0

發表評論

0條評論

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