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

資訊專欄INFORMATION COLUMN

閉包函數(shù)

pcChao / 2392人閱讀

摘要:當(dāng)閉包函數(shù)外部包含了一個(gè)匿名函數(shù)指向全局匿名函數(shù)執(zhí)行具有全局性指向原理每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量和。過(guò)度使用閉包可能會(huì)導(dǎo)致內(nèi)存占用過(guò)多閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值所以要注意寫(xiě)法

面試的時(shí)候一直會(huì)被問(wèn)到什么是閉包,以前也不是很在意,更沒(méi)有去總結(jié)和歸納.

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。

(一)閉包最基本的應(yīng)用:

少?gòu)U話,上代碼

還是<>的栗子,
function createComparisonFunction(propertyName) {
    return function(object1, object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];

        if(value1 < value2) {
            return -1;
        } else if(value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}
var compare = createComparisonFunction("name"); 

var result = compare({ name: "Nicholas" }, { name: "Greg" }); 

分析:
(1)閉包函數(shù)可以訪問(wèn)其外部函數(shù)
return出來(lái)的這個(gè)匿名函數(shù)就是一個(gè)閉包函數(shù),這個(gè)匿名函數(shù)中的訪問(wèn)了外部函數(shù)的活動(dòng)對(duì)象,就是這個(gè)propertyName參數(shù)。因?yàn)橥獠康淖饔糜蜴湵贿@個(gè)匿名函數(shù)所包含(也可以理解為:compare函數(shù)包含
createComparisonFunction()函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象),所以返回的這個(gè)匿名函數(shù)可以一直訪問(wèn)他外部的這個(gè)propertyName以及全局變量。
(2)閉包所引用的外部變量不會(huì)因?yàn)樗谧饔糜蜾N毀而銷毀
因?yàn)樵诜祷氐拈]包函數(shù)中,引用了外部函數(shù)的活動(dòng)對(duì)象,所以createComparisonFunction()內(nèi)的活動(dòng)對(duì)象(即propertyName)在createComparisonFunction()執(zhí)行完后不會(huì)被銷毀。因?yàn)殡m然createComparisonFunction執(zhí)行完后,會(huì)把其執(zhí)行環(huán)境中的作用域鏈銷毀,但是他的活動(dòng)對(duì)象仍然被閉包函數(shù)引用,放入了匿名函數(shù)的執(zhí)行環(huán)境的作用域中

(二)閉包的副作用

(1).閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值

        function createFunctions(){ 
            var result = new Array(); 
            for (var i=0; i < 10; i++){ 
                result[i] = function(){ 
                return i; 
                }; 
            } 
            return result; 
        }
        
        var res = createFunctions();
        console.log(res[0]());  //10
        console.log(res[1]());  //10

原理:
因?yàn)槊總€(gè)函數(shù)的作用域鏈中都保存著 createFunctions() 函數(shù)的活動(dòng)對(duì)象,所以它們引用的都是同一個(gè)變量 i 。 當(dāng)createFunctions()函數(shù)返回后,變量 i 的值是 10,此時(shí)每個(gè)函數(shù)都引用著保存變量 i 的同一個(gè)變量對(duì)象,所以在每個(gè)函數(shù)內(nèi)部 i 的值都是 10

解決方法:

獲取內(nèi)部函數(shù)的對(duì)象result[i]時(shí),使用匿名函數(shù),并在匿名函數(shù)中再使用閉包函數(shù),使得當(dāng)前環(huán)境下的num被閉包函數(shù)函數(shù)調(diào)用,存儲(chǔ)在作用域中不會(huì)被釋放.
        function  createFunctions2(){
            var result  = new Array();
            for(var i = 0 ; i <10 ; i++){
                result[i] = (function(num){
                    return function(){
                        return num
                    }
                })(i)
            }
            return result;
        }
        
        var res2 =  createFunctions2();
        console.log(res2[0]());  // 0 
        console.log(res2[1]());  // 1

原理:
定義了一個(gè)匿名函數(shù),并將立即執(zhí)行該匿名函數(shù)的結(jié)果賦給數(shù)組。這里的匿名函數(shù)有一個(gè)參數(shù) num,也就是最終的函數(shù)要返回的值。在調(diào)用每個(gè)匿名函數(shù)時(shí),我們傳入了變量 i。由于函數(shù)參數(shù)是按值傳遞的,所以就會(huì)將變量 i 的當(dāng)前值復(fù)制給參數(shù) num。而在這個(gè)匿名函數(shù)內(nèi)部,又創(chuàng)建并返回了一個(gè)訪問(wèn) num 的閉包。這樣一來(lái),result 數(shù)組中的每個(gè)函數(shù)都有自己num 變量的一個(gè)副本,因此就可以返回各自不同的數(shù)值了。

(2).當(dāng)閉包函數(shù)外部包含了一個(gè)匿名函數(shù),this指向全局

        var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {   
                return function () {        //匿名函數(shù)執(zhí)行具有全局性
                    return this.name;       //this指向window
                };
            }
        };

        console.log(object.getNameFunc()())  //  The Window

原理:
每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量:this 和 arguments。內(nèi)部函
數(shù)在搜索這兩個(gè)變量時(shí),只會(huì)搜索到其活動(dòng)對(duì)象為止,所以無(wú)法獲取到外部的this,此時(shí)getNameFunc()返回的是一個(gè)匿名函數(shù),并且匿名函數(shù)具有全局性,因此this指向全局的window

解決方案:
把外部作用域中的 this 對(duì)象保存在一個(gè)閉包能夠訪問(wèn)到的變量里,就可以讓閉包訪問(wèn)該對(duì)象了

    var name2 =  "The  Window";
    var object2 = {
        name:"My Object",
        getNameFunc:function(){
            var that =  this; //將外部函數(shù)的this保存在外部函數(shù)的活動(dòng)對(duì)象中(函數(shù)中申明的變量中)
            return function (){
                return that.name
            }
        }
    }
    
    console.log(object2.getNameFunc()())   //My Object

(三)
閉包的缺點(diǎn)
(1).由于閉包會(huì)攜帶包含它的函數(shù)的作用域,因此會(huì)比其他函數(shù)占用更多的內(nèi)存。過(guò)度使用閉包可能會(huì)導(dǎo)致內(nèi)存占用過(guò)多
(2).閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值,所以要注意寫(xiě)法

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

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

相關(guān)文章

  • 閉包,又見(jiàn)閉包。。。。?

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

    keelii 評(píng)論0 收藏0
  • 多層級(jí)理解閉包

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

    nemo 評(píng)論0 收藏0
  • 【JS腳丫系列】重溫閉包

    摘要:內(nèi)部的稱為內(nèi)部函數(shù)或閉包函數(shù)。過(guò)度使用閉包會(huì)導(dǎo)致性能下降。,閉包函數(shù)分為定義時(shí),和運(yùn)行時(shí)。循環(huán)會(huì)先運(yùn)行完畢,此時(shí),閉包函數(shù)并沒(méi)有運(yùn)行。閉包只能取得外部函數(shù)中的最后一個(gè)值。事件綁定種的匿名函數(shù)也是閉包函數(shù)。而對(duì)象中的閉包函數(shù),指向。 閉包概念解釋: 閉包(也叫詞法閉包或者函數(shù)閉包)。 在一個(gè)函數(shù)parent內(nèi)聲明另一個(gè)函數(shù)child,形成了嵌套。函數(shù)child使用了函數(shù)parent的參數(shù)...

    MartinDai 評(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
  • 面試官問(wèn)我:什么是JavaScript閉包,我該如何回答

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

    BenCHou 評(píng)論0 收藏0
  • Javascript閉包入門(mén)(譯文)

    摘要:也許最好的理解是閉包總是在進(jìn)入某個(gè)函數(shù)的時(shí)候被創(chuàng)建,而局部變量是被加入到這個(gè)閉包中。在函數(shù)內(nèi)部的函數(shù)的內(nèi)部聲明函數(shù)是可以的可以獲得不止一個(gè)層級(jí)的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請(qǐng)自行忽略。 譯者 :文章寫(xiě)在2006年,可直到翻譯的21小時(shí)之前作者還在完善這篇文章,在Stackoverflow的How do Java...

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

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

0條評(píng)論

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