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

資訊專欄INFORMATION COLUMN

閉包

weizx / 2410人閱讀

摘要:而閉包的神奇之處在于可以阻止這件事情的發(fā)生。依然持有對該作用域的引用,而這個引用就叫做閉包。當(dāng)然,無論使用何種方式對函數(shù)類型的值進(jìn)行傳遞,當(dāng)函數(shù)在別處被調(diào)用時都可以觀察到閉包。

下面我們來看一段代碼,清晰地展示了閉包:

function foo(){
    var a=2;
    function bar(){
        console.log(a);
    }
    return bar;
}
var baz=foo();
baz()     //2,這就是閉包

函數(shù)bar()的詞法作用域能夠訪問foo()的內(nèi)部作用域,然后我們將bar()函數(shù)本身當(dāng)作一個值類型進(jìn)行傳遞。在這個例子中,我們將bar
所引用的函數(shù)對象本身當(dāng)作返回值。
foo()執(zhí)行后,其返回值(也就是內(nèi)部的bar()函數(shù))賦值給變量baz并調(diào)用baz(),實(shí)際上只是通過不同的標(biāo)識符引用調(diào)用了內(nèi)部的函數(shù)
baz().雖然baz()被正常執(zhí)行,但是它是在自己定義的詞法作用域以外的地方執(zhí)行。
由于存在引擎垃圾回收器來釋放不再使用的內(nèi)存空間,由于看上去foo()的內(nèi)容不會再被引用,所以很自然地會考慮對其進(jìn)行回收。
而閉包的神奇之處在于可以阻止這件事情的發(fā)生。所以內(nèi)部作用域依然存在,而且就是baz()本身在使用。
bar()依然持有對該作用域(foo())的引用,而這個引用就叫做閉包。
當(dāng)然,無論使用何種方式對函數(shù)類型的值進(jìn)行傳遞,當(dāng)函數(shù)在別處被調(diào)用時都可以觀察到閉包。

function foo(){
    var a=2;
    function baz(){
        console.log(a);//2
    }
    bar(baz);
}
function bar(fn){
    fn();   //這就是閉包
}

把內(nèi)部函數(shù)baz傳遞給bar,當(dāng)調(diào)用這個內(nèi)部函數(shù)是(現(xiàn)在叫做fn),它涵蓋的foo()內(nèi)部作用域的閉包就可以觀察到了,因?yàn)樗軌蛟L問a。

傳遞的函數(shù)當(dāng)然也可以是間接的:

var fn;
function foo(){
    var a=2;
    function baz(){
        console.log(a);
    }
    fn=baz;
}
function bar(){
    fn();
}
foo();
bar(); //2

所以無論通過何種手段將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數(shù)都會使用閉包。

上面是為了可以解釋如何使用閉包而故意在結(jié)構(gòu)上加了些許修飾,下面我們來看日常使用到的閉包。

function wait(message){
    setTimeout(function timer(){
        console.log(message);
    },1000);
}
wait("Hello,closure");

將一個內(nèi)部函數(shù)(timer)傳遞給setTimeout(...).timer具有涵蓋wait()作用域的閉包,因此還保有對變量message的引用。
在引擎內(nèi)部,內(nèi)置的工具函數(shù)setTimeout()持有對一個參數(shù)的引用,這個參數(shù)也許叫做fn或者fnc,或者其他類似的名字。引擎會調(diào)用這個函數(shù),
在例子中就是內(nèi)部的timer函數(shù),而詞法作用域在這個過程保持完整。

再來看一個jq的:

function setupBot(name,selector){
    $(selector).click(function activator(){
        console.log("Activating:"+name);
    });
}
setupBot("Closure Bot1","#bot_1");
setupBot("Closure Bot2","#bot_2");

本質(zhì)上無論何時何地,如果將(訪問他們各自詞法作用域的)函數(shù)當(dāng)作第一級的值類型并導(dǎo)出傳遞,你就會看到閉包在這些函數(shù)中的應(yīng)用。在定時器、
事件監(jiān)聽器、Ajax請求、跨窗口通信,Web Workers或者任何其他異步(或者同步)任務(wù)中,只要使用了回調(diào)函數(shù),實(shí)際上就是在使用閉包!
(參考《你不知道的JavaSctipt上卷》)

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

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

相關(guān)文章

  • JS 中的閉包是什么?

    摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么??吹介]包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結(jié)下來。關(guān)于閉包的謠言閉包會造成內(nèi)存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露這個謠言是如何來的因?yàn)椤? 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...

    Enlightenment 評論0 收藏0
  • 閉包,又見閉包。。。。?

    摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數(shù)作用域達(dá)到了訪問外層變量的目的。此時一個完整的閉包實(shí)現(xiàn)了,的垃圾回收機(jī)制由于閉包的存在無法銷毀變量。 1.閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。 上面這段話來自 javascript 高級程序設(shè)計 第三版 P178 。作者說閉包是一個函數(shù),它有訪問另一個函數(shù)作用域中的變量的能力。 2.函數(shù)訪問它被創(chuàng)建時所處的...

    keelii 評論0 收藏0
  • 多層級理解閉包

    摘要:第二梯隊(duì)理解有了第一梯隊(duì)的認(rèn)識,我們慢慢修正大腦中對閉包的認(rèn)識。理解這句話就可以很好的與閉包這兩個字關(guān)聯(lián)起來理解閉包這個概念了??偨Y(jié)第二梯隊(duì)理解閉包是一個有特定功能的函數(shù)。第四梯隊(duì)理解閉包通過訪問外部變量,一個閉包可以維持這些變量。 閉包 閉包的概念困惑了我很久,記得當(dāng)時我面試的時候最后一面有一個問題就是問題關(guān)于閉包的問題,然而到現(xiàn)在已經(jīng)完全不記得當(dāng)時的題目是啥了,但仍然能夠回憶起當(dāng)時...

    nemo 評論0 收藏0
  • 面試官問我:什么是JavaScript閉包,我該如何回答

    摘要:到底什么是閉包這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項(xiàng)通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設(shè)計理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...

    BenCHou 評論0 收藏0

發(fā)表評論

0條評論

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