最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2009年11月01日 00:49:43   作者:  
在js中對象的外在表現(xiàn)形式為函數(shù)。
第一步. 定義后:每個已定義函數(shù),都有一個內在屬性[scope],其對應一個對象的列表,列表中的對象僅能內部訪問。

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

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


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

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


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



由此而來的建議:

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

2. 避免使用with語句。因為它會修改執(zhí)行上下文(Execution Context)的作用域鏈,在最前面添加一個對象(Variable Object)。同理,對于try-catch語句中的catch語句塊也類似。

相關文章

最新評論

广河县| 商洛市| 喀什市| 得荣县| 湘西| 兰溪市| 筠连县| 白玉县| 沾化县| 金坛市| 阿巴嘎旗| 肥东县| 彭阳县| 江阴市| 法库县| 金沙县| 福建省| 平潭县| 玛多县| 淳安县| 墨玉县| 洛隆县| 梨树县| 海丰县| 麻阳| 焦作市| 武定县| 深州市| 安塞县| 高雄县| 虹口区| 荣成市| 张家港市| 镇雄县| 油尖旺区| 长寿区| 中宁县| 杂多县| 仁怀市| 宣城市| 三原县|