国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js 函數(shù)的執(zhí)行環(huán)境和作用域鏈的深入解析

2019-11-21 01:01:29
字體:
供稿:網(wǎng)友
第一步. 定義后:每個(gè)已定義函數(shù),都有一個(gè)內(nèi)在屬性[scope],其對應(yīng)一個(gè)對象的列表,列表中的對象僅能內(nèi)部訪問。

例如:建立一個(gè)全局函數(shù)A,那么A的[Scope]內(nèi)部屬性中只包含一個(gè)全局對象(Global Object),而如果我們在A中創(chuàng)建一個(gè)新的函數(shù)B,那么B的[Scope]屬性中就包含兩個(gè)對象,函數(shù)A的Activation Object對象在前面,全局對象(Global Object)排在后面。

簡而言之,一個(gè)函數(shù)的[Scope]屬性中對象列表的順序是上一層函數(shù)的Activation Object對象,然后是上上層的,一直到最外層的全局對象。


第二步.執(zhí)行時(shí):當(dāng)一個(gè)函數(shù)被執(zhí)行的時(shí)候,會自動創(chuàng)建一個(gè)可以執(zhí)行的對象(Execution Object),并同時(shí)綁定一個(gè)作用域鏈(Scope Chain)。作用域鏈會通過下面兩個(gè)步驟來建立,用于進(jìn)行標(biāo)識符解析。

首先,將函數(shù)對象[Scope]內(nèi)部屬性中的對象,按順序復(fù)制到作用域鏈Scope Chain中。
其次,在函數(shù)執(zhí)行時(shí),會創(chuàng)建一個(gè)新的Activation Object對象,這個(gè)對象中包含了this、參數(shù)(arguments)、局部變量(包括命名的參數(shù))的定義,這個(gè)Activation Object對象會被置于作用域鏈的最前面。
所以在Scope Chain中最后順序是本函數(shù)的Activation Object,然后是上層函數(shù)的Activation Object,再上上層的Activation Object,一直到Global Object。


當(dāng)執(zhí)行js代碼的過程中,遇到一個(gè)標(biāo)識符,就會根據(jù)標(biāo)識符的名稱,在執(zhí)行上下文(Execution Context)的作用域鏈中進(jìn)行搜索。從作用域鏈的第一個(gè)對象(該函數(shù)的Activation Object對象)開始,如果沒有找到,就搜索作用域鏈中的下一個(gè)對象,如此往復(fù),直到找到了標(biāo)識符的定義。如果在搜索完作用域中的最后一個(gè)對象,也就是全局對象(Global Object)以后也沒有找到,則會拋出一個(gè)錯(cuò)誤,提示undefined。



由此而來的建議:

1. 盡量使用局部變量,這不僅僅是涉及到私有屬性的問題,局部的變量從以上過程中可以看到,能夠減少搜索的時(shí)間(注:在一般的情況下,不包括瀏覽器的優(yōu)化行為)。

2. 避免使用with語句。因?yàn)樗鼤薷膱?zhí)行上下文(Execution Context)的作用域鏈,在最前面添加一個(gè)對象(Variable Object)。同理,對于try-catch語句中的catch語句塊也類似。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 共和县| 蒙自县| 泰来县| 平果县| 涞源县| 多伦县| 交口县| 米易县| 图木舒克市| 周至县| 邢台市| 新河县| 永泰县| 若尔盖县| 青冈县| 临武县| 应城市| 买车| 阿城市| 桃园市| 揭东县| 嘉荫县| 桃源县| 棋牌| 洪湖市| 宣武区| 石楼县| 麦盖提县| 石家庄市| 鞍山市| 平阴县| 三明市| 留坝县| 乐业县| 屏边| 双牌县| 偏关县| 淳安县| 化州市| 宣威市| 化州市|