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

資訊專欄INFORMATION COLUMN

js知識(shí)梳理6:關(guān)于函數(shù)的要點(diǎn)梳理(2)(作用域鏈和閉包)

aristark / 2705人閱讀

摘要:在此例中,在匿名函數(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)存中。

寫在前面

注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的作者和譯者。有發(fā)現(xiàn)什么問題的,歡迎留言指出。

1.執(zhí)行環(huán)境

執(zhí)行環(huán)境簡稱“環(huán)境”,定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù)。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。

全局執(zhí)行環(huán)境是最外圍的一個(gè)執(zhí)行環(huán)境。在Web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象,因此所有全局變量和函數(shù)都是作為window對(duì)象的屬性和方法創(chuàng)建的。

某個(gè)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢,環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀。

執(zhí)行流:每個(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)境。

代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈(scope chain),用途是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象。如果這個(gè)環(huán)境是函數(shù),則將其活動(dòng)對(duì)象作為變量對(duì)象。活動(dòng)對(duì)象在最開始時(shí)只包含arguments 對(duì)象。作用域鏈的下一個(gè)變量對(duì)象來自包含環(huán)境,而再下一個(gè)變量對(duì)象則來自下一個(gè)包含環(huán)境。這樣,一直延續(xù)到全局執(zhí)行環(huán)境;全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象:

var color = "blue";
function changeColor() {
    if(color == "blue"){
        color = "red";
    }else{
        color = "blue";
    }
}
changeColor();
console.log("color is:" + color);//red

例子中,函數(shù)changeColor()的作用域鏈包含兩個(gè)對(duì)象:它自己的變量對(duì)象(其中定義著arguments對(duì)象)和全局環(huán)境的變量對(duì)象。可以在函數(shù)內(nèi)部訪問變量 color,就是因?yàn)榭梢?strong>在作用域鏈中找到它。

var color = "blue";
function changeColor() {
    var anotherColor = "red";

    function swapColors() {
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;

        //這里可以訪問color、anotherColor和tempColor
    }

    //這里可以訪問color和anotherColor,但不能訪問tempColor
    swapColors();
}
// 這里只能訪問color 
changeColor();

以上共涉及3個(gè)執(zhí)行環(huán)境:全局環(huán)境、changeColor()的局部環(huán)境和swapColors()的局部環(huán)境。顯然,內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)

2.閉包

閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。

function createComparisonFunction(propertyName) {
    return function (object1, object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
        if(value1value2){
            return 1;
        }else{
            return 0;
        }
    }
}
//創(chuàng)建函數(shù)
var compareNames = createComparisonFunction("name");
//調(diào)用函數(shù)
var result = compareNames({name:"jaychou"},{name:"xiaoming"});
//解除對(duì)匿名函數(shù)的引用(釋放內(nèi)存)
compareNames = null;

以上過程:

1.定義函數(shù)內(nèi)部的函數(shù)時(shí),會(huì)將它的包含函數(shù)的活動(dòng)對(duì)象添加到它的作用域鏈中。在此例中,在匿名函數(shù)被返回后,它的作用域鏈初始化為包含createComparisonFunction()函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。

2.createComparisonFunction()函數(shù)在執(zhí)行完畢后,其活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象,結(jié)果就是只是createComparisonFunction()的執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,其活動(dòng)對(duì)象會(huì)留在內(nèi)存中。

3.直到代碼中將匿名函數(shù)置為null釋放內(nèi)存后,createComparisonFunction()的活動(dòng)對(duì)象才會(huì)被銷毀。

注意:由于閉包會(huì)攜帶包含它的函數(shù)的作用域,所以會(huì)比其他函數(shù)占用更多的內(nèi)存,過多使用閉包會(huì)導(dǎo)致內(nèi)存占用過多,所以在很有必要時(shí)才考慮使用閉包。

3.閉包的最常見問題
function createFunctions() {
    var result = new Array();
    for(var i=0;i<10;i++){
        result[i] = function () {
            return i;
        };
    }
    return result;
}
console.log(createFunctions()[4]());//會(huì)打印10

數(shù)組里面的每個(gè)函數(shù)都是打印10,因?yàn)槊總€(gè)函數(shù)的作用域鏈中都保存著createFunctions()函數(shù)的活動(dòng)對(duì)象,所以他們引用的都是同一個(gè)變量i。當(dāng)函數(shù)數(shù)組被返回時(shí),變量i的值是10,所以就是上面的結(jié)果了。通過創(chuàng)建另一個(gè)匿名函數(shù)的改造如下符合預(yù)期:

function createFunctions() {
    var result = new Array();
    for(var i=0;i<10;i++){
        result[i] = function (num) {
            return function () {
                return num;
            }
        }(i);
    }
    return result;
}
console.log(createFunctions()[4]());//會(huì)打印4

沒有直接把閉包賦值給數(shù)組,而是定義了一個(gè)匿名函數(shù),并將立即執(zhí)行該匿名函數(shù)的結(jié)果賦給函數(shù),函數(shù)參數(shù)是按值傳遞的,所以會(huì)把變量i的當(dāng)前值復(fù)制給參數(shù)num。

在這個(gè)立即執(zhí)行函數(shù)里面創(chuàng)建并返回了一個(gè)訪問num的閉包。這個(gè)閉包被返回時(shí)都準(zhǔn)確包含了對(duì)應(yīng)的包含環(huán)境的活動(dòng)對(duì)象的num值。

4.閉包的常見作用

給構(gòu)造函數(shù)創(chuàng)建私用變量和私有函數(shù),并定義特權(quán)方法;

創(chuàng)建單例,在函數(shù)最后返回公用方法

等等

總體而言,閉包對(duì)于我們理解執(zhí)行環(huán)境,理解作用域鏈很有幫助,但平常如果不是很有必要就不要用,占用內(nèi)存比較多

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

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

相關(guān)文章

  • 好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總

    摘要:好程序員前端培訓(xùn)入門之基礎(chǔ)知識(shí)梳理匯總,前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。作用域鏈的前端,始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象。   好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總,Web前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。不論是專業(yè)還是非專業(yè),有基礎(chǔ)亦或是無基礎(chǔ),都想通過學(xué)習(xí)Web前端實(shí)現(xiàn)高薪就業(yè)。不過,學(xué)習(xí)要一...

    int64 評(píng)論0 收藏0
  • 好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總

    摘要:好程序員前端培訓(xùn)入門之基礎(chǔ)知識(shí)梳理匯總,前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。作用域鏈的前端,始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象。   好程序員Web前端培訓(xùn)入門之JS基礎(chǔ)知識(shí)梳理匯總,Web前端工程師是當(dāng)前各大企業(yè)都比較稀缺的人才,薪資待遇和就業(yè)前景都很不錯(cuò)。不論是專業(yè)還是非專業(yè),有基礎(chǔ)亦或是無基礎(chǔ),都想通過學(xué)習(xí)Web前端實(shí)現(xiàn)高薪就業(yè)。不過,學(xué)習(xí)要一...

    kviccn 評(píng)論0 收藏0
  • JS核心知識(shí)點(diǎn)梳理——上下文、作用域、閉包、this(上)

    摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關(guān)的面試題,對(duì)核心知識(shí)點(diǎn)中的作用域閉包上下文進(jìn)行了梳理。如果在小區(qū)這個(gè)作用域找到了張老師,我就會(huì)在張老師的輔導(dǎo)下學(xué)鋼琴我張老師房間鋼琴構(gòu)成了學(xué)琴的上下文環(huán)境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大...

    Andrman 評(píng)論0 收藏0
  • JS基礎(chǔ)知識(shí):變量對(duì)象、作用鏈和閉包

    摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對(duì)象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問權(quán)限的變量和函數(shù)的有序訪問。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對(duì)于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...

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

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

0條評(píng)論

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