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

資訊專欄INFORMATION COLUMN

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

longmon / 2819人閱讀

摘要:以上是從作用域的角度對閉包的理解,我們還可以結(jié)合執(zhí)行上下文棧來理解閉包。這就是需要理解閉包的核心內(nèi)容。即,執(zhí)行到第行時,全局上下文環(huán)境將變?yōu)榛顒訝顟B(tài),但是上下文環(huán)境依然會在執(zhí)行上下文棧中。

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

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

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

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

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

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

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

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

上一節(jié)講到自由變量跨作用域取值時,曾經(jīng)強(qiáng)調(diào)過:要去創(chuàng)建這個函數(shù)的作用域取值,而不是“父作用域”。理解了這一點,以上兩段代碼中,自由變量如何取值應(yīng)該比較簡單。

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

在前面講執(zhí)行上下文棧時說到,有些情況下,函數(shù)調(diào)用完成之后,其執(zhí)行上下文環(huán)境不會接著被銷毀。這就是需要理解閉包的核心內(nèi)容。

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

第一步,代碼執(zhí)行前(預(yù)處理階段)生成全局上下文環(huán)境,并在執(zhí)行時對其中的變量進(jìn)行賦值。此時全局上下文環(huán)境是活動狀態(tài)。

圖片描述

第二步,執(zhí)行第17行代碼時,調(diào)用fn(),產(chǎn)生fn()執(zhí)行上下文環(huán)境,壓棧,并設(shè)置為活動狀態(tài)。

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

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

——即,執(zhí)行到第18行時,全局上下文環(huán)境將變?yōu)榛顒訝顟B(tài),但是fn()上下文環(huán)境依然會在執(zhí)行上下文棧中。另外,執(zhí)行完第18行,全局上下文環(huán)境中的max被賦值為100。如下圖:

第四步,執(zhí)行到第20行,執(zhí)行f1(15),即執(zhí)行bar(15),創(chuàng)建bar(15)上下文環(huán)境,并將其設(shè)置為活動狀態(tài)。

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

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

使用閉包會增加內(nèi)容開銷,現(xiàn)在很明顯了吧!

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    dayday_up 評論0 收藏0

發(fā)表評論

0條評論

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