js關于作用域鏈以及閉包的理解

js的作用域鏈是由當前執行環境下的變量對象以及上層的執行環境下的變量對象組成,它保證了當前執行環境對符合訪問它的權限的函數以及變量的訪問順序


例子

以上為例子的話,他們的執行上下文相繼被創建,而他們的變量對象可以這么來表示;

VO(全局){

arguments:.....

function:test()

var :....

}

VO(test){

arguments:....

function:add()

var:a

}

VO(add){

arguments:...

function:...

var:a

}

而add的作用域鏈,則同時包含了這三個變量對象。所以add的執行上下文中的作用域鏈可以這么表示:

add{

VO: ?//變量對象

scopeChain: [VO(add),VO(test),VO(global)], // 作用域鏈

this ? //this指向

}

從他們的關系可以用一個數組來表示

而數組的末端就是全局變量對象

所以作用域鏈可以用一個單方向的通道來表示,以它自己為最前端為起點,最末端為重點,

所以作用域鏈是由一系列變量對象組成的一個單方面的一個通道,這樣我們就可以在這個單方面的通道里面訪問上一層的函數和變量。

閉包的意思

當函數可以記住并且訪問當前作用域(全局作用域除外),即使這個函數是在當前作用域之外執行。

假設一個例子,一個函數???在函數???里面定義并且訪問了函數???里面的變量,那么B九四閉包。

通過閉包,我們可以在其他執行上下文當中,訪問到函數的內部變量。如下例子


我們通過函數bar訪問到了函數foo中的變量。

this

this的查找

this的查找是很多人迷茫的一點,也似乎有很多人抱有this不穩定這樣的看法,實在令人無語。this的查找可以說是3種對象查找中最為簡單的,因為其實this對象的確定根本沒有一個“查找”的過程。

首先,this對象只會在一個函數中需要確定,如果是在全局域下,this永遠為Global對象,在瀏覽器中通常就是window對象。而在javascript中,函數的調用一共有4種方式:

Function Invocation Pattern

諸如`foo()`的調用形式被稱為Function Invocation Pattern,是函數最直接的使用形式,注意這里的foo是作為單獨的變量出現,而不是屬性。

在這種模式下,foo函數體中的this永遠為Global對象,在瀏覽器中就是window對象。

Method Invocation Pattern

諸如`foo.bar()`的調用形式被稱為Method Invocation Pattern,注意其特點是被調用的函數作為一個對象的屬性出現,必然會有“.”或者“[]”這樣的關鍵符號。

在這種模式下,bar函數體中的this永遠為“.”或“[”前的那個對象,如上例中就一定是foo對象。

Constructor Pattern

`new foo()`這種形式的調用被稱為Constructor Pattern,其關鍵字`new`就很能說明問題,非常容易識別。

在這種模式下,foo函數內部的this永遠是new foo()返回的對象。

Apply Pattern

`foo.call(thisObject)`和`foo.apply(thisObject)`的形式被稱為Apply Pattern,使用了內置的`call`和`apply`函數。

在這種模式下,`call`和`apply`的第一個參數就是foo函數體內的this,如果thisObject是`null`或`undefined`,那么會變成Global對象。

應用以上4種方式,確定一個函數是使用什么樣的Pattern進行調用的,就能很容易確定this是什么。

另外,this是永遠不會延作用域鏈或原原型鏈出現一個“查找”的過程的,只會在函數調用時就完全確認。?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容