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

資訊專欄INFORMATION COLUMN

js閉包的應(yīng)用

didikee / 1480人閱讀

摘要:前言之前發(fā)了一篇文章,寫了一些對于閉包的理解?,F(xiàn)在補上閉包的應(yīng)用篇,很慚愧因為嚴(yán)重的拖延癥一直拖到現(xiàn)在。本文主要分享一些常見的閉包用法和分析,也希望能增加對閉包的理解。

前言

之前發(fā)了一篇文章,寫了一些對于閉包的理解?,F(xiàn)在補上閉包的應(yīng)用篇,(很慚愧因為嚴(yán)重的拖延癥一直拖到現(xiàn)在)。本文主要分享一些常見的閉包用法和分析,也希望能增加對閉包的理解。

簡單回顧

在之前的文章里,講解了閉包的原理,如果忘記了可以點擊這里再看一下,在這里我們簡單回顧一些知識點:

閉包的本質(zhì)是一個函數(shù)

閉包可以訪問函數(shù)內(nèi)部變量

閉包的存在會使內(nèi)部變量保留在內(nèi)存中

閉包的應(yīng)用

閉包常見的用法,就將圍繞這些特點展開:

1.模仿塊級作用域

首先簡單舉個例子來,解釋一下什么是塊級作用域:

function A(num) {
    for (var i = 0; i < num; i++) {
      num++;
    }
    console.log(i)
  }

在這個簡單的函數(shù)中,變量i是在for循環(huán)中定義的,如果是在C++或者Java中,這樣定義的變量,一旦循環(huán)結(jié)束,變量也就隨之銷毀,i的作用范圍只在循環(huán)這個小塊,就稱為塊級作用域。在javascript中,沒有這樣的塊級作用域,前面一篇文章已經(jīng)提到,變量是定義在函數(shù)的活動對象中的,因此,從定義i開始,在函數(shù)內(nèi)部可以隨時訪問它。
這樣的壞處顯而易見:由于javascript不會告訴你變量是否已經(jīng)被聲明,容易造成命名沖突,如果是在全局環(huán)境定義的變量,就會污染全局環(huán)境,因此可以利用閉包特性來模擬塊級作用域。不過在此之前要先介紹另一個知識點:匿名立即執(zhí)行函數(shù)。如果已經(jīng)比較熟悉的同學(xué)可以直接跳過這一塊:

匿名立即執(zhí)行函數(shù)

首先舉個例子(我比較喜歡舉例,感覺看例子比較更容易理解):

var helloWorld = function(){
    alert("Hello world")
}
helloWorld();//執(zhí)行函數(shù)

上面的簡短代碼一共就做兩件事:1.定義了一個匿名函數(shù)并賦值給helloWorld;2.在helloWorld后面加括號表示調(diào)用函數(shù),所以 匿名函數(shù)如果直接執(zhí)行,是不是應(yīng)該這樣寫:

function(){
    alert("Hello world")
}()

這樣的寫法會報錯,因為在javascript中,function是函數(shù)聲明的標(biāo)志,不允許在后面直接加括號,而應(yīng)該寫成這樣:

(function(){
    //函數(shù)體
    alert("Hello world")
})()

也就是把聲明部分加括號即可,加了括號以后,這一段代碼就相當(dāng)于執(zhí)行了里面的函數(shù)體部分,但是此時內(nèi)部的變量已經(jīng)不能被外部訪問,請看下面詳細(xì)樣例

具體實現(xiàn)

現(xiàn)在我們講模擬塊級作用域的具體步驟,假設(shè)還是針對前面的A函數(shù),如果我們想讓i變量只有塊級作用域,可以這樣寫:

function A(num) {
    //核心代碼
   (funnction(){
    for(var i = 0; i

注意看核心代碼部分,我們用剛剛講到的匿名自執(zhí)行函數(shù)在內(nèi)部形成了一個閉包,這個閉包在哪呢?一直強調(diào),閉包的本質(zhì)是函數(shù),其實在這里閉包就是那個匿名函數(shù),這個閉包可以到函數(shù)A內(nèi)部的活動變量,又能保證自己內(nèi)部的變量在自執(zhí)行后直接銷毀,這個應(yīng)該不難理解了

優(yōu)點分析

這種寫法的經(jīng)常用在全局環(huán)境中,可以避免添加太多的全局變量和全局函數(shù),特別是多人合作開發(fā)的時候,可以減少因此產(chǎn)生的命名沖突等,避免污染全局環(huán)境。

2.存儲變量

我們知道閉包的另一個特點是可以保存外部函數(shù)的變量,原理是基于javascript中函數(shù)作用域鏈的特點,內(nèi)部函數(shù)保留了對外部函數(shù)的活動變量的引用,所以變量不會被釋放(這一塊沒有理解清楚的請看前一篇文章,里面講的比較詳細(xì)),然后我們再來愉快地舉例子:

function B(){
    var x = 100;
    return {
        function(){
            return x
        }
    }
}
var m = B()//運行B函數(shù),生成活動變量 x被m引用

這是前文介紹過的一個最簡單的閉包例子,我們運行B函數(shù),返回值就是B內(nèi)部的匿名函數(shù),此時m引用了變量x,所以B執(zhí)行后x不會被釋放,利用這一點,我們可以把比較重要或者計算耗費很大的值存在x中,只需要第一次計算賦值后,就可以通過m函數(shù)引用x的值,不必重復(fù)計算,同時也不容易被修改

優(yōu)點分析

這種寫法可能會用在把一些不經(jīng)常變動,但是計算比較復(fù)雜的值保存起來,就可以節(jié)省每次訪問的時間。

3.封裝私有變量

javascript中沒有私有成員的概念,我們可以把函數(shù)當(dāng)做一個范圍,函數(shù)內(nèi)的變量就是私有變量,在外部無法引用,比如:

function C(a,b){
    var c = a - b ;
    return c
}

在這個函數(shù)中,a b c都是私有變量,在外部無法訪,利用閉包的特點,我們可以就可以創(chuàng)建可以訪問私有變量的方法:

function Person(){
    var name = "default";
    this.getName:function(){
        return name;
    }
    this,setName:function(value){
        name = value;
    }
}
console.log(Person.getName())//default
console.log(Person.setName("mike"))
console.log(Person.getName())//mike

在這個例子中,設(shè)置了兩個閉包函數(shù)來操作Person函數(shù)內(nèi)部的name變量,除了這兩個函數(shù),在外部無法再訪問到name變量,name也就相當(dāng)于是私有成員。在這個例子中,我們用的是在構(gòu)造函數(shù)中定義公有方法,對于所有的Person實例,都分別創(chuàng)建了新的辦法,當(dāng)然還可以使用其他形式來避免這個問題,要涉及到創(chuàng)建對象模式的一些知識,在這里說明怕反而增加了閉包的理解難度,之后在寫對象和繼承的時候再提到(下一次更新一定不會這樣久了QAQ)。

小結(jié)

關(guān)于閉包的主要主要應(yīng)用就講到這里,本文中很多知識點與上一篇文章有關(guān),又因為發(fā)布相隔時間比較長(我的鍋),建議大家可以先看看上一篇復(fù)習(xí)一下,這篇相對來前一篇容易理解,而且在舉例過程盡量沒有加入其它的疑難知識點,希望能對看到的人有所幫助。以上內(nèi)容屬于個人見解,如果有不同意見,歡迎指出和探討。同時,碼字不易請尊重作者的版權(quán),轉(zhuǎn)載請注明出處,如作商用,請與作者聯(lián)系,感謝!

補充

如果看完對您有幫助,順手點個推薦唄~

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

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

相關(guān)文章

  • js 閉包使用技巧

    摘要:閉包的學(xué)術(shù)定義先來參考下各大權(quán)威對閉包的學(xué)術(shù)定義百科閉包,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體。 前言 上一章講解了閉包的底層實現(xiàn)細(xì)節(jié),我想大家對閉包的概念應(yīng)該也有了個大概印象,但是真要用簡短的幾句話來說清楚,這還真不是件容易的事。這里我們就來總結(jié)提煉下閉包的概念,以應(yīng)付那些非專人士的心血來潮。 閉包的學(xué)術(shù)...

    dendoink 評論0 收藏0
  • JS核心知識點梳理——上下文、作用域、閉包、this(中)

    摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關(guān)的面試題,對核心知識點中的作用域閉包上下文進(jìn)行了梳理。本篇重點介紹閉包和。所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大量資料,并集...

    rottengeek 評論0 收藏0
  • 詳解js閉包

    摘要:但閉包的情況不同嵌套函數(shù)的閉包執(zhí)行后,,然后還在被回收閉包會使變量始終保存在內(nèi)存中,如果不當(dāng)使用會增大內(nèi)存消耗。每個函數(shù),不論多深,都可以認(rèn)為是全局的子作用域,可以理解為閉包。 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)。 閉包的特性 閉包有三個特性: 1.函數(shù)嵌套函數(shù) 2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量 3.參數(shù)和變量不會...

    Chiclaim 評論0 收藏0
  • js閉包本質(zhì)

    摘要:也正因為這個閉包的特性,閉包函數(shù)可以讓父函數(shù)的數(shù)據(jù)一直駐留在內(nèi)存中保存,從而這也是后來模塊化的基礎(chǔ)。只有閉包函數(shù),可以讓它的父函數(shù)作用域永恒,像全局作用域,一直在內(nèi)存中存在。的本質(zhì)就是如此,每個模塊文件就是一個大閉包。 為什么會有閉包 js之所以會有閉包,是因為js不同于其他規(guī)范的語言,js允許一個函數(shù)中再嵌套子函數(shù),正是因為這種允許函數(shù)嵌套,導(dǎo)致js出現(xiàn)了所謂閉包。 function...

    qianfeng 評論0 收藏0
  • js閉包理解

    摘要:一般來講,函數(shù)執(zhí)行完畢后,局部活動對象就會被銷毀,內(nèi)存中僅保存全局作用域,但是閉包的情況有所不同理解閉包的前提先理解另外兩個內(nèi)容作用域鏈垃圾回收作用域鏈當(dāng)代碼在執(zhí)行過程中,會創(chuàng)建變量對象的一個作用域鏈。 閉包是javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包來實現(xiàn)。個人的理解是:函數(shù)中嵌套函數(shù)。 閉包的定義及其優(yōu)缺點 閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的...

    EasonTyler 評論0 收藏0

發(fā)表評論

0條評論

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