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

資訊專欄INFORMATION COLUMN

javascript 閉包

CoderDock / 1052人閱讀

摘要:換言之,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。什么是作用域鏈這個(gè)概念其實(shí)也是比較虛的概念,不太好理解。一層層的作用域鏈往外走到最后則為對(duì)象的全局作用域。然后這一條條的作用域鏈就形成了一整條關(guān)聯(lián)的鏈條。

一、定義:

常規(guī)定義:

閉包的定義: 有權(quán)利訪問外部函數(shù)作用域的函數(shù)。

通俗定義:

1、函數(shù)內(nèi)部包含了函數(shù)。然后內(nèi)部函數(shù)可以訪問外部函數(shù)的作用域。
2、內(nèi)部函數(shù)可以訪問 父級(jí)函數(shù)的作用域。
...等等等

二、思考:

1、我們?cè)谌粘5拈_發(fā)過程中會(huì)應(yīng)用到 閉包么?

以之前的知識(shí)對(duì)于 閉包的理解來(lái)講是這樣的
    (function(){
        for(var i=0; i<10; i++) {
            console.log(i)
        }
    })()
    
或者說(shuō)是這樣的
    var fnX = function() {
        var x = 123
        function y() {
            alert(x)
        }
        y()
    }

    fnX()   // 123

總結(jié)下之前的理解就是: 內(nèi)部函數(shù)能訪問外部函數(shù)作用域,能夠保存變量不被銷毀而一直存在。

三、作用:

在JavaScript中有作用域和執(zhí)行環(huán)境的問題,在函數(shù)內(nèi)部的變量在函數(shù)外部是無(wú)法訪問的,在函數(shù)內(nèi)部卻可以得到全局變量。由于種種原因,我們有時(shí)候需要得到函數(shù)內(nèi)部的變量,可是用常規(guī)方法是得不到的,這時(shí)我們就可以創(chuàng)建一個(gè)閉包,用來(lái)在外部訪問這個(gè)變量。

通過將一個(gè)方法或者屬性聲明為私用的,可以讓對(duì)象的實(shí)現(xiàn)細(xì)節(jié)對(duì)其他對(duì)象保密以降低對(duì)象之間的耦合程度,可以保持?jǐn)?shù)據(jù)的完整性并對(duì)其修改方式加以約束,這樣可以是代碼更可靠,更易于調(diào)試。封裝是面向?qū)ο蟮脑O(shè)計(jì)的基石。

3.1 什么是作用域
3.1.1 ES5的作用域問題
在 ES5 中 我們常常會(huì)說(shuō)的一個(gè)概念是 局部變量 和 全局變量

那么 局部變量 和 全局變量 所這個(gè) 局部 和 全局則為 作用域。

這個(gè)概念其實(shí)介紹起來(lái)還是比較多虛無(wú)。 但是我記得有一本書 叫 《你不知道的JS》

在這本書的 上冊(cè) 作者詳細(xì)的介紹了 作用域 這個(gè)概念。

作用域是什么

  1.現(xiàn)代JavaScript已經(jīng)不再是解釋執(zhí)行的,而是編譯執(zhí)行的。但是與傳統(tǒng)的編譯語(yǔ)言不同,它不是提前編譯,編譯結(jié)果不能進(jìn)行移植。編譯過程中,同樣會(huì)經(jīng)過分詞/詞法分析,解析/語(yǔ)法分析,代碼生成三個(gè)階段。

  2.以var a = 2;語(yǔ)句為例,對(duì)這一程序語(yǔ)句對(duì)處理,需要經(jīng)過引擎,編譯器,作用域三者的配合。其中,引擎從頭到尾負(fù)責(zé)整個(gè)javascript程序的編譯和執(zhí)行過程;編譯器負(fù)責(zé)語(yǔ)法分析和代碼生成;作用域負(fù)責(zé)收集并維護(hù)由所有聲明的標(biāo)識(shí)符組成的系列查詢,并實(shí)施一套規(guī)則,確定當(dāng)前執(zhí)行的代碼對(duì)這些標(biāo)識(shí)符的訪問權(quán)限。

  3.對(duì)于var a = 2;編譯器首先查找作用域中是否已經(jīng)有該名稱的變量,然后引擎中執(zhí)行編譯器生成的代碼時(shí),會(huì)首先查找作用域。如果找到就執(zhí)行賦值操作,否則就拋出異常

  4.引擎對(duì)變量的查找有兩種:LHS查詢和RHS查詢。當(dāng)變量出現(xiàn)中賦值操作左側(cè)時(shí)是LHS查詢,出現(xiàn)中右側(cè)是RHS查詢

詞法作用域

1.詞法作用域就是定義在詞法階段的作用域。詞法作用域是由你在寫代碼時(shí)將變量和塊作用域?qū)懺谀睦餂Q定的,詞法處理器分析代碼時(shí)會(huì)保持作用域不變

2.作用域查找會(huì)在找到第一個(gè)匹配的標(biāo)識(shí)符時(shí)停止

3.eval和with可以欺騙詞法作用域,不推薦使用

函數(shù)作用域和塊作用域

1.JavaScript具有基于函數(shù)的作用域,屬于這個(gè)函數(shù)的變量都可以在整個(gè)函數(shù)的范圍內(nèi)使用及復(fù)用
2.(function fun(){})() 函數(shù)表達(dá)式和函數(shù)聲明的區(qū)別是看function關(guān)鍵字出現(xiàn)在聲明中的位置。如果function是聲明中的第一個(gè)詞,那么就是一個(gè)函數(shù)聲明,否則就是一個(gè)函數(shù)表達(dá)式

3.with,try/catch具有塊作用域,方便好用的實(shí)現(xiàn)塊級(jí)作用域的是es6帶來(lái)的let關(guān)鍵字

提升

    1. 變量的提升
    2. 函數(shù)提升  (這里就不過多的贅述了)

動(dòng)態(tài)作用域

  1.詞法作用域是一套引擎如何尋找變量以及會(huì)在何處找到變量的規(guī)則。詞法作用域最重要的特征是它的定義過程發(fā)生中代碼的書寫階段

  2.動(dòng)態(tài)作用域讓作用域作為一個(gè)在運(yùn)行時(shí)就被動(dòng)態(tài)確定的形式,而不是在寫代碼時(shí)進(jìn)行靜態(tài)確定的形式。eg:
function foo(){ 
    console.log(a);  // 2 
} 
function bar(){ 
    var a = 3; 
    foo(); 
} 
var a = 2; 
bar(); 
詞法作用域讓foo()中的a通過RHS引用到了全局作用域中的a,所以輸出2;動(dòng)態(tài)作用域不關(guān)心函數(shù)和作用域如何聲明以及在何處聲明,只關(guān)心從何處調(diào)用。換言之,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。如果以動(dòng)態(tài)作用域來(lái)看,上面代碼中執(zhí)行時(shí)會(huì)輸出3


  3.JavaScript不具備動(dòng)態(tài)作用域,但是this機(jī)制中某種程度上很像動(dòng)態(tài)作用域,this關(guān)注函數(shù)如何調(diào)用。
3.1.2 ES6的作用域問題
在 ES6 中 出現(xiàn)了塊級(jí)作用域的概念

let const 在() 內(nèi)則 ()內(nèi)的作用域 為 塊級(jí)作用域。
3.2 什么是執(zhí)行環(huán)境
執(zhí)行環(huán)境 即為 當(dāng)前作用域內(nèi)的環(huán)境。
3.3 什么是作用域鏈
這個(gè)概念其實(shí) 也是比較虛的概念,不太好理解。但是一旦理解就不會(huì)忘記了。

所謂 鏈 其實(shí)就是鏈條, 將需要鏈接在一起的東西鏈接在一起(感覺說(shuō)了一句廢話)

作用域鏈的通俗理解:

在函數(shù)內(nèi)部作用域 通過 作用域鏈 可以訪問 函數(shù)外部作用域 的屬性或者方法。

一層層的 作用域鏈 往外走  到最后 則為 window 對(duì)象的全局作用域。

然后這一條條的 作用域鏈 就形成了一整條關(guān)聯(lián)的鏈條。
四、具體案例的分析:

這里 我們舉了一個(gè)栗子

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

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

相關(guān)文章

  • Javascript閉包入門(譯文)

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

    Fourierr 評(píng)論0 收藏0
  • 理解Javascript閉包

    摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。可惜的是,并沒有提供相關(guān)的成員和方法來(lái)訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個(gè)非常重要的語(yǔ)言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語(yǔ)言C/C++的程序員來(lái)說(shuō)是一個(gè)新的語(yǔ)言特性。本文將...

    dayday_up 評(píng)論0 收藏0
  • JavaScript閉包,只學(xué)這篇就夠了

    摘要:當(dāng)在中調(diào)用匿名函數(shù)時(shí),它們用的都是同一個(gè)閉包,而且在這個(gè)閉包中使用了和的當(dāng)前值的值為因?yàn)檠h(huán)已經(jīng)結(jié)束,的值為。最好將閉包當(dāng)作是一個(gè)函數(shù)的入口創(chuàng)建的,而局部變量是被添加進(jìn)這個(gè)閉包的。 閉包不是魔法 這篇文章使用一些簡(jiǎn)單的代碼例子來(lái)解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...

    CoderBear 評(píng)論0 收藏0
  • JavaScript深入之閉包

    摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...

    caige 評(píng)論0 收藏0
  • 還擔(dān)心面試官問閉包

    摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說(shuō)筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記] JavaScript 閉包

    摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來(lái)說(shuō),一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀。所以此時(shí),的作用域鏈雖然銷毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...

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

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

0條評(píng)論

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