前面的話
前端日問,鞏固基礎,不打烊!!!
解答先來說幾個概念:
函式執行上下文中的ao
函式的執行上下文在呼叫時被建立,建立之後分為兩個階段:進入執行上下文和執行**。這兩個過程的ao會有一定的差異,下面通過例子來分析:
function
foo(a)
vard
=function()
; b =3;
}foo(1
);
當執行foo
函式時,會建立相應的執行上下文。
在**執行階段,會順序執行**,然後改變ao物件中的值,當**執行完畢之後,對應的ao會變為:
ao=,
a:1, b:3,
c: reference to functionc(
),d: reference to functionexpression "d"
}
總結
作用域鏈
定義:由多個執行上下文的變數物件構成的鍊錶。
通俗來說,比如乙個函式裡面,訪問了乙個變數,先從其ao物件中找,如果沒有的話就從其父級的中的ao物件中找,最終找到全域性物件。
函式建立時:
函式有乙個內部屬性[[scope]], 當函式建立時,就會儲存所有父級的變數物件到其中。
舉個例子:
function
foo(
)}
函式建立時,各自的[[scope]]為:
foo.
[[scope]]=
[ globalcontext.vo]
;bar.
[[scope]]=
[ foocontext.ao,
globalcontext.vo]
;
函式被呼叫時
當函式被呼叫時,會建立函式執行上下文,將自身的ao物件新增到作用域鏈的前端。
此時再來看一下上面兩個函式的作用域鏈:
foo.
[[scope]]=
[ao, globalcontext.vo]
;bar.
[[scope]]=
[ao, foocontext.ao,
globalcontext.vo]
;
作用域 作用域鏈
理解 就是一塊 地盤 乙個 段所在的區域 它是靜態的 相對於上下文物件 在編寫 時就確定了 分類全域性作用域 函式作用域 沒有塊作用域 es6有了 作用隔離變數,不同作用域下同名變數不會有衝突 區別1全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時 ...
作用域和作用域鏈
全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...
作用域和作用域鏈
var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...