一。執行期上下文:當函式執行時,會建立乙個成為執行期上下文的內部物件。乙個執行期上下文定義了乙個函式執行時的環境,函式每次執行時對應的執行期上下文都是獨一無二的,所以多次呼叫乙個函式會建立多個執行期上下文。每當函式執行完畢,它所產生的執行期上下文被銷毀。
即:函式執行時才會產生自己的ao,執行結束後立即銷毀自己的ao。
二。查詢變數:從函式作用域的頂端依次向下查詢。
三。[[ scope ]] :每個js函式都是乙個物件,物件中有一些屬性我們可以訪問,但有些不可以,這些屬性僅供js引擎訪問,
[[ scope ]] 就是其中乙個。
[[ scope ]] 指的是我們所說的作用域,其中儲存了執行期上下文的集合。
四。作用域鏈:[[ scope ]] 中所儲存的執行期上下文物件的集合,這個集合呈現鏈式連線,我們把這種鏈式連線叫做作用域鏈
(我們真正看的東西,需要的東西,將在這裡面查詢)
下面的**模擬作用域鏈的產生:
function a()
var a = 123;
b();
}var glob = 100;
a();
過程: 作用域鏈(由上至下)
1. a函式被定義: go
2. a函式被執行: ao a } 這是a的ao。在b執行結束後銷毀。
go global:100 }
3. b函式被定義: ao a }
go global:100 }
4. b函式被執行: ao b } 這是b的ao。在b執行結束後銷毀。
ao a }
go global:100 }
函式被定義的時候產生的作用域鏈直接是他外部封裝他的函式的ao.go,在執行時,作用域鏈的最頂層新增自己的ao,其餘的ao,ao按照原來的順序依次下移一位。
這就好像 站在巨人的肩膀上看世界,剛出生時他能看到的東西,其實就是巨人看到的東西。
js之作用域
1.什麼是作用域 作用域是用於收集儲存維護變數,以及當前執行 宣告的變數所擁有的許可權,例如 function foo a foo1 666 function foo2 a g a 在foo2函式中 a向g賦值 此時g在foo2作用域中也不存在,他也向上查詢,遇到window物件,發現其中也沒有定義...
作用域 作用域鏈 精解
物件有屬性有方法 一切有物件的東西都有屬性 物件導向就是基於此了解物件導向 在函式方法上有乙個隱性屬性 scope 作用域 其中儲存了執行期上下文的集合也就是預編譯時所產生的 稱為執行期上下文的內部物件ao 在函式執行的前一刻會進行預編譯 生成ao物件 什麼是預編譯 函式每次執行時所生成的執行期上下...
JS作用域精講
當我們定義乙個變數並給他賦值時var a 1 其實js引擎分開了兩步來執行 1.var a宣告這個變數,並將它放到當前作用域中去 2.a 1在作用域中找到變數a然後將其賦值1 函式亦是如此 當我們宣告乙個函式時function fn js引擎同樣將其分開了兩步來執行 1.function fn fu...