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

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

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

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

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


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

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


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



由此而來的建議:

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

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

相關文章

最新評論