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

資訊專欄INFORMATION COLUMN

關(guān)于js閉包

livem / 1029人閱讀

摘要:在作用域鏈中,外部函數(shù)的活動(dòng)對(duì)象始終處于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位,直到作用域鏈終點(diǎn)即全局執(zhí)行環(huán)境。更為重要的是函數(shù)在執(zhí)行完畢后,其他活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。

原文鏈接----請(qǐng)點(diǎn)這里

??閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見(jiàn)方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
??之所以一個(gè)內(nèi)部的函數(shù)可以訪問(wèn)其外部的變量,而且在其被返回或是調(diào)用時(shí)還可以訪問(wèn),是因?yàn)檫@個(gè)內(nèi)部函數(shù)的作用域鏈中包含外部函數(shù)的作用域。

知識(shí)儲(chǔ)備

在了解閉包之前,先要熟悉以下幾點(diǎn):
??1. 首先要理解執(zhí)行環(huán)境,執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問(wèn)的其他數(shù)據(jù)。
??2. 每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。
??3. 每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入到一個(gè)環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。
??4. 當(dāng)某個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境及其相應(yīng)的作用域鏈。然后使用arguments和其他命名參數(shù)的值來(lái)初始化函數(shù)的活動(dòng)對(duì)象。在函數(shù)中,活動(dòng)對(duì)象作為變量對(duì)象使用(作用域鏈?zhǔn)怯擅繉拥淖兞繉?duì)象鏈起來(lái)的)。
??5. 在作用域鏈中,外部函數(shù)的活動(dòng)對(duì)象始終處于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位,直到作用域鏈終點(diǎn)即全局執(zhí)行環(huán)境。
??6. 作用域鏈的本質(zhì)是一個(gè)指向變量對(duì)象的指針列表,它只引用但不實(shí)際包含變量對(duì)象。

1.一般情況下

??不談?wù)撻]包,一般的,從在全局執(zhí)行環(huán)境創(chuàng)建一個(gè)函數(shù)開(kāi)始。
??在創(chuàng)建一個(gè)函數(shù)時(shí),會(huì)創(chuàng)建一個(gè)預(yù)先包含全局變量對(duì)象的作用域鏈,這個(gè)作用域鏈被保存在函數(shù)內(nèi)部的[[Scope]]
??然后執(zhí)行流進(jìn)入這個(gè)函數(shù),函數(shù)的執(zhí)行環(huán)境被壓入環(huán)境棧中,此函數(shù)執(zhí)行環(huán)境的活動(dòng)對(duì)象作為變量對(duì)象被創(chuàng)建并推入執(zhí)行環(huán)境作用域鏈的前端。
??對(duì)這個(gè)例子中的函數(shù)而言,其作用域鏈中包含兩個(gè)變量對(duì)象:本地活動(dòng)對(duì)象和全局變量對(duì)象。
??無(wú)論在什么時(shí)候在函數(shù)中訪問(wèn)變量時(shí),會(huì)從作用域鏈搜索變量名。
??一般情況下,函數(shù)執(zhí)行完,局部活動(dòng)對(duì)象就會(huì)被銷毀,內(nèi)存中僅有全局作用域(里邊只有全局執(zhí)行環(huán)境的變量對(duì)象)。
??以下面這段代碼為例:

function compare (value1, value2) {         
//創(chuàng)建一個(gè)預(yù)先包含全局變量對(duì)象的作用域鏈,保存在[[Scope]]
    if (value1 < value2) {
//訪問(wèn)函數(shù)變量時(shí),即在代碼最后一條語(yǔ)句執(zhí)行過(guò)程中,會(huì)從作用域鏈前端開(kāi)始搜索變量名
        return -1;
    } else if (value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}
var result = compare(5, 10);
//執(zhí)行流進(jìn)入函數(shù)時(shí),compare的執(zhí)行環(huán)境壓入環(huán)境棧
//compare執(zhí)行環(huán)境的活動(dòng)對(duì)象作為變量對(duì)象接到作用域鏈的前端
//函數(shù)執(zhí)行完,compare執(zhí)行環(huán)境彈出棧,compare活動(dòng)對(duì)象銷毀

如圖,作用域鏈從0開(kāi)始向后查找:

2.產(chǎn)生閉包的情況下

如下是一個(gè)以屬性名作為參數(shù),按其屬性的值對(duì)數(shù)據(jù)進(jìn)行排序的函數(shù):

function createComparisonFunction(propertyName) {     
    return function(object1,object2){         //返回一個(gè)匿名函數(shù)
        var value1=object1[propertyName];
        var value2=object2[propertyName];
        if(value1value2){
            return 1;
        } else {
            return 0;
        }
    };
}
var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];
data.sort(createComparisonFunction("name"));
console.log(data[0]);           //Object {name: "Nicholas", age: 29}
data.sort(createComparisonFunction("age"));
console.log(data[0]);           //Object {name: "Zachary", age: 28}

createComparisonFunction()函數(shù)和返回的匿名函數(shù)的作用域鏈如下圖所示:

??在匿名函數(shù)從createComparisonFunction()中被返回后,它的作用域鏈被初始化為包含createComparisonFunction()函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。這樣,匿名函數(shù)就可以訪問(wèn)在createComparisonFunction()中定義的所有變量。

更為重要的是:

??createComparisonFunction()函數(shù)在執(zhí)行完畢后,其他活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。

??當(dāng)createComparisonFunction()函數(shù)返回后,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,但它的活動(dòng)對(duì)象仍然會(huì)留在內(nèi)存中;直到匿名函數(shù)被銷毀,createComparisonFunction()的活動(dòng)對(duì)象才會(huì)被銷毀。

??例如以下代碼,返回的匿名函數(shù)被保存在變量compareNames中,通過(guò)將compareNames設(shè)置為null來(lái)解除對(duì)匿名函數(shù)的引用,解除引用之后垃圾回收例程將會(huì)清除該匿名函數(shù),隨之該匿名函數(shù)的作用域鏈也會(huì)被銷毀,則其作用域鏈上的其他作用域也會(huì)安全的銷毀(全局作用域除外)。

var compareNames = createComparisonFunction("name");
var result = compareNames({ name: "Nicholas" }, { name: "Greg" });
compareNames = null;

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87055.html

相關(guān)文章

  • 關(guān)于js中的閉包問(wèn)題

    摘要:閉包解決的問(wèn)題獲取到函數(shù)內(nèi)部的變量讓變量不會(huì)隨著函數(shù)執(zhí)行完畢就銷毀而是保存在內(nèi)存中模擬私有變量閉包產(chǎn)生的問(wèn)題容易造成內(nèi)存泄漏,保存的多了,卻沒(méi)有釋放的指向問(wèn)題,在閉包里,指向的是關(guān)于閉包的小東西比如注釋部分省了外殼, 閉包概念:能夠訪問(wèn)另一個(gè)函數(shù)作用域的變量的函數(shù),來(lái)個(gè)栗子 showImg(https://segmentfault.com/img/bVbvnmY?w=604&h=245...

    icyfire 評(píng)論0 收藏0
  • js知識(shí)梳理6:關(guān)于函數(shù)的要點(diǎn)梳理(2)(作用域鏈和閉包)

    摘要:在此例中,在匿名函數(shù)被返回后,它的作用域鏈初始化為包含函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。函數(shù)在執(zhí)行完畢后,其活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象,結(jié)果就是只是的執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,其活動(dòng)對(duì)象會(huì)留在內(nèi)存中。 寫(xiě)在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書(shū)籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,...

    aristark 評(píng)論0 收藏0
  • JS 中的閉包是什么?

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

    Enlightenment 評(píng)論0 收藏0
  • 翻譯連載 | JavaScript輕量級(jí)函數(shù)式編程-第7章: 閉包vs對(duì)象 |《你不知道的JS》姊妹

    摘要:相像閉包和對(duì)象之間的關(guān)系可能不是那么明顯。一個(gè)沒(méi)有對(duì)象的編程語(yǔ)言可以用閉包來(lái)模擬對(duì)象。事實(shí)上,表達(dá)一個(gè)對(duì)象為閉包形式,或閉包為對(duì)象形式是相當(dāng)簡(jiǎn)單的。簡(jiǎn)而言之,閉包和對(duì)象是狀態(tài)的同構(gòu)表示及其相關(guān)功能。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,...

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

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

0條評(píng)論

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