欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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


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

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


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



由此而來的建議:

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

2. 避免使用with語句。因?yàn)樗鼤?huì)修改執(zhí)行上下文(Execution Context)的作用域鏈,在最前面添加一個(gè)對(duì)象(Variable Object)。同理,對(duì)于try-catch語句中的catch語句塊也類似。

相關(guān)文章

最新評(píng)論