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

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

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

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

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


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

首先,將函數(shù)對象[Scope]內(nèi)部屬性中的對象,按順序復(fù)制到作用域鏈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。


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



由此而來的建議:

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

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

相關(guān)文章

最新評論

平利县| 金昌市| 贵德县| 仁布县| 泽州县| 方山县| 隆德县| 南汇区| 阿荣旗| 凌云县| 绥滨县| 伊宁市| 新乡市| 大同市| 洪泽县| 万州区| 高淳县| 彭州市| 长岛县| 克拉玛依市| 河北省| 梁山县| 丁青县| 石楼县| 浦江县| 东安县| 卢氏县| 驻马店市| 吉木萨尔县| 仲巴县| 舟曲县| 文安县| 静海县| 抚宁县| 绥德县| 贵港市| 措美县| 宜丰县| 临邑县| 通辽市| 巫溪县|