亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

longmon / 2847人閱讀

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

理解了上下文環(huán)境、作用域、作用域鏈以及自由變量,我們?cè)賮?lái)聊聊閉包。

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

第一,函數(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)時(shí),用到了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ù)作為一個(gè)參數(shù)被傳遞進(jìn)入另一個(gè)函數(shù),賦值給f參數(shù)。執(zhí)行f(20)時(shí),max變量的取值是10,而不是100,所以打印結(jié)果是true。

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

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

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

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

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

圖片描述

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

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

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

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

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

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/91723.html

相關(guān)文章

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

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

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

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

    alanoddsoff 評(píng)論0 收藏0
  • Javascript 深入理解閉包

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

    Corwien 評(píng)論0 收藏0
  • 深入javascript——作用域和閉包

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

    oogh 評(píng)論0 收藏0
  • 理解Javascript閉包

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

    dayday_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<