js執(zhí)行期上下文

抽象概念铲掐,簡而言之js是在執(zhí)行上下文中運行的窍箍。

類型 3種

全局執(zhí)行上下文

這是默認或者說基礎的上下文,任何不在函數(shù)內部的代碼都在全局上下文中哩照。它會執(zhí)行兩件事:創(chuàng)建一個全局的 window 對象(瀏覽器的情況下)挺物,并且設置 this 的值等于這個全局對象。一個程序中只會有一個全局執(zhí)行上下文飘弧。

函數(shù)執(zhí)行上下文

每當一個函數(shù)被調用時, 都會為該函數(shù)創(chuàng)建一個新的上下文识藤。每個函數(shù)都有它自己的執(zhí)行上下文,不過是在函數(shù)被調用時創(chuàng)建的次伶。函數(shù)上下文可以有任意多個蹋岩。每當一個新的執(zhí)行上下文被創(chuàng)建,它會按定義的順序(將在后文討論)執(zhí)行一系列步驟学少。

Eval 函數(shù)執(zhí)行上下文

執(zhí)行在 eval 函數(shù)內部的代碼也會有它屬于自己的執(zhí)行上下文,但由于 JavaScript 開發(fā)者并不經常使用 eval秧骑,所以在這里我不會討論它版确。

執(zhí)行棧

是一種LIFO(后進先出)的數(shù)據(jù)結構扣囊, 用來儲存執(zhí)行上下文

當javascript引擎檢測到腳本時,就會創(chuàng)建一個全局執(zhí)行上下文并且將其壓入到執(zhí)行棧底部(最先被創(chuàng)建的)绒疗。當有函數(shù)被調用時會生成一個函數(shù)執(zhí)行上下文侵歇,然后被壓入執(zhí)行棧的頂部。
執(zhí)行引擎會先執(zhí)行棧頂?shù)暮瘮?shù)執(zhí)行上下文吓蘑,當函數(shù)執(zhí)行完畢會被彈出惕虑,然后執(zhí)行下一個執(zhí)行期上下文。

創(chuàng)建執(zhí)行期上下文

在javascript代碼執(zhí)行前會創(chuàng)建執(zhí)行上下文磨镶。創(chuàng)建會經歷三件事

1. this的綁定
2. 詞法環(huán)境組件創(chuàng)建
3. 變量環(huán)境組件創(chuàng)建

所以會有:

    ExecutionContext = {
        ThisBinding = < this value > ,
        LexicalEnvironment = {
            ...
        },
        VariableEnvironment = {
            ...
        },
    }

this綁定

被誰調用this就指向誰溃蔫,如果沒被調用就指向全局

    let foo = {
        baz: function() {
            console.log(this);
        }
    }

    foo.baz(); // 'this' 引用 'foo', 因為 'baz' 被對象 'foo' 調用

    let bar = foo.baz;
    bar(); // 'this' 指向全局 window 對象,因為沒有指定引用對象

詞法環(huán)境和變量環(huán)境

在 ES6 中琳猫,詞法環(huán)境和變量環(huán)境的一個不同就是前者被用來存儲函數(shù)聲明和變量(let 和 const)綁定伟叛,而后者只用來存儲 var 變量綁定。
在初始化的時候let 和 const 定義的變量并不會關聯(lián)任何值脐嫂,但 var 定義的變量被設成了 undefined统刮。
這是因為在創(chuàng)建階段時,引擎檢查代碼找出變量和函數(shù)聲明账千,雖然函數(shù)聲明完全存儲在環(huán)境中侥蒙,但是變量最初設置為 undefined(var 情況下),或者未初始化(let 和 const 情況下)匀奏。
這就是為什么你可以在聲明之前訪問 var 定義的變量(雖然是 undefined)鞭衩,但是在聲明之前訪問 let 和 const 的變量會得到一個引用錯誤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末攒射,一起剝皮案震驚了整個濱河市醋旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌会放,老刑警劉巖饲齐,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咧最,居然都是意外死亡捂人,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門矢沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滥搭,“玉大人,你說我怎么就攤上這事捣鲸∩遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵栽惶,是天一觀的道長愁溜。 經常有香客問我疾嗅,道長,這世上最難降的妖魔是什么冕象? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任代承,我火速辦了婚禮,結果婚禮上渐扮,老公的妹妹穿的比我還像新娘论悴。我一直安慰自己,他們只是感情好墓律,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布膀估。 她就那樣靜靜地躺著,像睡著了一般只锻。 火紅的嫁衣襯著肌膚如雪玖像。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天齐饮,我揣著相機與錄音捐寥,去河邊找鬼。 笑死祖驱,一個胖子當著我的面吹牛握恳,可吹牛的內容都是我干的。 我是一名探鬼主播捺僻,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼乡洼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匕坯?” 一聲冷哼從身側響起束昵,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葛峻,沒想到半個月后锹雏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡术奖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年礁遵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采记。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡佣耐,死狀恐怖,靈堂內的尸體忽然破棺而出唧龄,到底是詐尸還是另有隱情兼砖,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站掖鱼,受9級特大地震影響然走,放射性物質發(fā)生泄漏。R本人自食惡果不足惜戏挡,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晨仑。 院中可真熱鬧褐墅,春花似錦、人聲如沸洪己。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答捕。三九已至逝钥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拱镐,已是汗流浹背艘款。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沃琅,地道東北人哗咆。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像益眉,于是被迫代替她去往敵國和親晌柬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351