1.執(zhí)行環(huán)境
- 執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù)庸诱,并決定他們各自的行為。
- 每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)聯(lián)的變量對象晤揣,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對象中桥爽。
- 某個(gè)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀昧识,保存在其中的變量和函數(shù)定義也隨之銷毀聚谁。
2.執(zhí)行上下文
- 每次當(dāng)控制器轉(zhuǎn)到ECMAScript可執(zhí)行代碼的時(shí)候,即會(huì)進(jìn)入到一個(gè)執(zhí)行上下文滞诺。
- 執(zhí)行上下文是ECMA-262標(biāo)準(zhǔn)里的一個(gè)抽象概念形导,用于同可執(zhí)行代碼概念進(jìn)行區(qū)分。
- 活動(dòng)的執(zhí)行上下文組在邏輯上組成一個(gè)堆棧习霹,堆棧底部永遠(yuǎn)都是全局上下文朵耕,而頂部就是當(dāng)前執(zhí)行上下文。
3.作用域
- 作用域是一個(gè)函數(shù)在執(zhí)行時(shí)期的執(zhí)行環(huán)境淋叶。
- ES6得作用域中不存在聲明提前
- 變量要在聲明后使用阎曹,否則報(bào)錯(cuò)。
4.作用域鏈
- 當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí)煞檩,會(huì)創(chuàng)建變量對象的一個(gè)作用域鏈处嫌。
- 作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問斟湃。
- 活動(dòng)對象最開始時(shí)只包含一個(gè)變量熏迹,即arguments對象。
- 全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個(gè)對象凝赛。
- 在局部作用域中定義的變量可以在局部環(huán)境中與全局變量相互使用注暗。
5.延長作用域鏈
- try-catch語句中的catch塊:創(chuàng)建一個(gè)新的變量對象,其中包含的是被拋出的錯(cuò)誤對象的聲明墓猎。
- with語句:將指定的對象添加到作用域鏈中 捆昏。
6.塊級(jí)作用域
作用場景:
- 內(nèi)存變量可能會(huì)覆蓋外層變量。
- 用來計(jì)數(shù)的循環(huán)變量泄露為全局變量毙沾。
7.閉包
- 指有權(quán)訪問另一個(gè)作用域鏈中的函數(shù)
- 讀取函數(shù)內(nèi)部的局部變量骗卜;易造成變量污染。
- 變量的值保存在內(nèi)存中,不會(huì)被垃圾回收機(jī)制回收寇仓;易造成內(nèi)存泄漏勇皇。
8.垃圾收集策略
- 標(biāo)記清除:當(dāng)變量進(jìn)入環(huán)境時(shí),就將這個(gè)變量標(biāo)記為“進(jìn)入變量”焚刺。
- 引用計(jì)數(shù):跟蹤記錄每個(gè)值被引用的次數(shù)敛摘,當(dāng)這個(gè)值的引用次數(shù)變成0時(shí),將其占用的內(nèi)存空間回收乳愉。