js關(guān)于作用域鏈以及閉包的理解

js的作用域鏈?zhǔn)怯僧?dāng)前執(zhí)行環(huán)境下的變量對(duì)象以及上層的執(zhí)行環(huán)境下的變量對(duì)象組成溉愁,它保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問(wèn)它的權(quán)限的函數(shù)以及變量的訪問(wèn)順序


例子

以上為例子的話,他們的執(zhí)行上下文相繼被創(chuàng)建邢笙,而他們的變量對(duì)象可以這么來(lái)表示;

VO(全局){

arguments:.....

function:test()

var :....

}

VO(test){

arguments:....

function:add()

var:a

}

VO(add){

arguments:...

function:...

var:a

}

而add的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象裆操。所以add的執(zhí)行上下文中的作用域鏈可以這么表示:

add{

VO: ?//變量對(duì)象

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

this ? //this指向

}

從他們的關(guān)系可以用一個(gè)數(shù)組來(lái)表示

而數(shù)組的末端就是全局變量對(duì)象

所以作用域鏈可以用一個(gè)單方向的通道來(lái)表示,以它自己為最前端為起點(diǎn),最末端為重點(diǎn)鳖谈,

所以作用域鏈?zhǔn)怯梢幌盗凶兞繉?duì)象組成的一個(gè)單方面的一個(gè)通道,這樣我們就可以在這個(gè)單方面的通道里面訪問(wèn)上一層的函數(shù)和變量阔涉。

閉包的意思

當(dāng)函數(shù)可以記住并且訪問(wèn)當(dāng)前作用域(全局作用域除外)缆娃,即使這個(gè)函數(shù)是在當(dāng)前作用域之外執(zhí)行捷绒。

假設(shè)一個(gè)例子,一個(gè)函數(shù)???在函數(shù)???里面定義并且訪問(wèn)了函數(shù)???里面的變量贯要,那么B九四閉包暖侨。

通過(guò)閉包,我們可以在其他執(zhí)行上下文當(dāng)中崇渗,訪問(wèn)到函數(shù)的內(nèi)部變量字逗。如下例子


我們通過(guò)函數(shù)bar訪問(wèn)到了函數(shù)foo中的變量。

this

this的查找

this的查找是很多人迷茫的一點(diǎn)宅广,也似乎有很多人抱有this不穩(wěn)定這樣的看法葫掉,實(shí)在令人無(wú)語(yǔ)。this的查找可以說(shuō)是3種對(duì)象查找中最為簡(jiǎn)單的跟狱,因?yàn)槠鋵?shí)this對(duì)象的確定根本沒(méi)有一個(gè)“查找”的過(guò)程俭厚。

首先,this對(duì)象只會(huì)在一個(gè)函數(shù)中需要確定驶臊,如果是在全局域下挪挤,this永遠(yuǎn)為Global對(duì)象,在瀏覽器中通常就是window對(duì)象资铡。而在javascript中电禀,函數(shù)的調(diào)用一共有4種方式:

Function Invocation Pattern

諸如`foo()`的調(diào)用形式被稱為Function Invocation Pattern幢码,是函數(shù)最直接的使用形式笤休,注意這里的foo是作為單獨(dú)的變量出現(xiàn),而不是屬性症副。

在這種模式下店雅,foo函數(shù)體中的this永遠(yuǎn)為Global對(duì)象,在瀏覽器中就是window對(duì)象贞铣。

Method Invocation Pattern

諸如`foo.bar()`的調(diào)用形式被稱為Method Invocation Pattern闹啦,注意其特點(diǎn)是被調(diào)用的函數(shù)作為一個(gè)對(duì)象的屬性出現(xiàn),必然會(huì)有“.”或者“[]”這樣的關(guān)鍵符號(hào)辕坝。

在這種模式下窍奋,bar函數(shù)體中的this永遠(yuǎn)為“.”或“[”前的那個(gè)對(duì)象,如上例中就一定是foo對(duì)象酱畅。

Constructor Pattern

`new foo()`這種形式的調(diào)用被稱為Constructor Pattern琳袄,其關(guān)鍵字`new`就很能說(shuō)明問(wèn)題,非常容易識(shí)別纺酸。

在這種模式下窖逗,foo函數(shù)內(nèi)部的this永遠(yuǎn)是new foo()返回的對(duì)象。

Apply Pattern

`foo.call(thisObject)`和`foo.apply(thisObject)`的形式被稱為Apply Pattern餐蔬,使用了內(nèi)置的`call`和`apply`函數(shù)碎紊。

在這種模式下佑附,`call`和`apply`的第一個(gè)參數(shù)就是foo函數(shù)體內(nèi)的this,如果thisObject是`null`或`undefined`仗考,那么會(huì)變成Global對(duì)象音同。

應(yīng)用以上4種方式,確定一個(gè)函數(shù)是使用什么樣的Pattern進(jìn)行調(diào)用的痴鳄,就能很容易確定this是什么瘟斜。

另外,this是永遠(yuǎn)不會(huì)延作用域鏈或原原型鏈出現(xiàn)一個(gè)“查找”的過(guò)程的痪寻,只會(huì)在函數(shù)調(diào)用時(shí)就完全確認(rèn)螺句。?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市橡类,隨后出現(xiàn)的幾起案子蛇尚,更是在濱河造成了極大的恐慌,老刑警劉巖顾画,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件取劫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡研侣,警方通過(guò)查閱死者的電腦和手機(jī)谱邪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庶诡,“玉大人惦银,你說(shuō)我怎么就攤上這事∧┦模” “怎么了扯俱?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)喇澡。 經(jīng)常有香客問(wèn)我迅栅,道長(zhǎng),這世上最難降的妖魔是什么晴玖? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任读存,我火速辦了婚禮,結(jié)果婚禮上呕屎,老公的妹妹穿的比我還像新娘让簿。我一直安慰自己,他們只是感情好榨惰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布拜英。 她就那樣靜靜地躺著,像睡著了一般琅催。 火紅的嫁衣襯著肌膚如雪居凶。 梳的紋絲不亂的頭發(fā)上虫给,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音侠碧,去河邊找鬼抹估。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弄兜,可吹牛的內(nèi)容都是我干的药蜻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼替饿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼语泽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起视卢,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤踱卵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后据过,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惋砂,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绳锅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了西饵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳞芙,死狀恐怖眷柔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情积蜻,我是刑警寧澤闯割,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布彻消,位于F島的核電站竿拆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宾尚。R本人自食惡果不足惜丙笋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煌贴。 院中可真熱鬧御板,春花似錦、人聲如沸牛郑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淹朋。三九已至笙各,卻和暖如春钉答,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杈抢。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工数尿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惶楼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓右蹦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歼捐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子何陆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 對(duì)于js中的閉包,無(wú)論是老司機(jī)還是小白,我想,見(jiàn)得不能再多了,然而有時(shí)三言兩語(yǔ)卻很難說(shuō)得明白,反正在我初學(xué)時(shí)...
    itclanCoder閱讀 4,181評(píng)論 1 11
  • 函數(shù)申明: 函數(shù)表達(dá)式: 遞歸 閉包 閉包是有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量函數(shù)。 即使函數(shù)中的匿名函數(shù)被返回了豹储,...
    IT男的成長(zhǎng)記錄閱讀 126評(píng)論 0 0
  • 繼承 一甲献、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關(guān)的對(duì)象共享這一特性颂翼,可以實(shí)現(xiàn)繼承晃洒,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,050評(píng)論 0 3
  • 來(lái)源:仗劍走天涯呻疹! 關(guān)于javascript的作用域的一些總結(jié),主要參考以上文章吃引,加上自己的整理的理解。 近日對(duì)j...
    Michael_林閱讀 919評(píng)論 0 1
  • 先來(lái)說(shuō)說(shuō)昨天為啥沒(méi)寫吧刽锤!拖著疲憊的身軀镊尺,把娃安頓睡下之后就埋頭于手抄報(bào)的制作中了…沒(méi)錯(cuò),一張四開紙大小的手抄報(bào)并思,“...
    Daisy1982閱讀 159評(píng)論 1 1