function test(){}
? ? ? ? 運行期上下文:當函數執行時,會創建一個稱為執行期上下文的內部對象。一個執行期上下文定義了一個函數執行時的環境,函數每次執行時對應的執行上下文都是?獨一無二的,所以多次調用一個函數對導致創建多個執行上下文,當函數執行完畢,它所產生的執行上下文被銷毀。
? ? ? ? [[scope]]:每個javascript函數都是一個對象,對象中有些屬性我們可以訪問,但有些不可以,這些屬性僅供javascript引擎存取,[[scope]]就是其中一個。
? ? ? ? [[scope]]指的就是我們所說的作用域,其中存儲了運行期上下文的集合。
? ? ? ? 作用域鏈:[[scope]]中所存儲的執行期上下文對象的集合,這個集合呈鏈式鏈接,我們把這種鏈式鏈接叫做作用域鏈。
????????
例1:
function a(){function b(){var b = 234;}var a = 123;b();
}
var glob = 100;
a();
作用域鏈:
驗證b的作用域鏈中的執行期上下文與a的作用域鏈中的執行期上下文是否是同一個:
function a(){function b(){var b = 234;aa = 0; //修改a的值}var aa = 123;b();console.log(aa); //0}var glob = 100;a();
結果是為同一個。
例2:
function a(){function b(){function c(){}c();}b();}a();a defined a.[[scope]] -- > 0:GOa doing a.[[scope]] -- > 0:aAO1:GOb defined b.[[scope]] -- > 0:aAO1:GOb doing b.[[scope]] -- > 0:bAO1:aAO2:GOc defined c.[[scope]] -- > 0:bAO1:aAO2:GOc doing c.[[scope]] -- > 0:cAO1:bAO2:aAO3:GO