作用域與作用域鏈
① 作用域屬於乙個函式,乙個函式產生了不一樣的作用域
② 函式名.[[scope]] 函式的隱式屬性
③[[scope]] 指的就是作用域,其中儲存了執行期的上下文的集合,而這一集合就是作用域鏈
④查詢變數:從作用域鏈的頂端依次向下查詢(在那個函式裡面查詢變數,就上那個函式的作用域鏈的頂端依次向下查詢變數
)2. 函式的執行期上下文
① 當函式執行的前一刻,會建立乙個稱為執行期上下文的內部物件ao
② 乙個執行期上下文定義了乙個函式執行時的環境(也就是函式預編譯建立ao後下面的步驟操作),函式每次執行時對應的執行上下文都是獨一無二的
③ 多次呼叫乙個函式會導致建立多個執行上下文,當函式執行完畢,它所產生的執行上下文會被銷毀
3 . 用**和**說明函式執行時的作用域鏈和執行上下文問題
① **
function a(){
function b(){
var b = 234;
var a = 123;
b();
var glob = 100;
a();
② 說明
**執行說明
1. a被定義時,在其自己所處的環境下(全域性環境)建立了乙個執行期上下文(go)將其放在
其作用域鏈的頂端,即0位處
2. a被執行時,會再次建立乙個屬於自己函式體的執行期上下文(ao)並將這個ao放在其作用域
鏈的頂端,即0位處,原先的那個go會被向下推一位,位於作用域鏈的1位處
3. b被定義時,會在其自己所處的環境下建立執行期上下文,此時它處於a的函式體內,因此它會
繼承a原先已經建立好的作用域鏈,即a的ao和在全域性環境下建立的go
4. b被執行時,會建立屬於自己函式體的執行期上下文(ao)並將其放在其作用域鏈的頂端,即0
位處,原先繼承的a的ao和go會以此向下推,位於1位和2位處
5. b被執行完成後,b自己的執行期上下文會被銷毀,從而b函式會回歸到b被定義的時刻
6. a被執行完成後,a自己的執行期上下文會被銷毀,從而a函式會回歸到a被定義的時刻,因為b函式
就位於a函式的函式體內,因此當a自己的執行期上下文被銷毀的那一刻,b函式也會被永久銷毀
7. 下一次開始,以此迴圈
③ **說明
a被定義時
a被執行時
b被定義時
b被執行時
b被執行完成後,會銷毀自己的執行上下文,從而剪斷作用域鏈上連線自己的執行上下文的那根線,回歸至
b被定義時的狀態
a被執行完成後,會銷毀自己的執行上下文,從而剪斷作用域鏈上連線自己的執行上下文的那根線,回歸至
a被定義時的狀態,但是,因為
b函式在
a函式的函式體內,所以
b會被銷毀掉
4.關於作用域與作用域鏈的其他**說明
**一function a(){
function b(){
var b = 234;
a = 0; //這個a是屬於a函式自己的,位於a函式的ao上
var a = 123;
b();
console.log(a); //0
var glob = 100;
a();
**二function a(){
function b(){
var b = 234;
var a = 0; //這個a是屬於b函式自己的,是在他的函式體內定義的,位於b函式的ao上
console.log(a); //0
var a = 123;
b();
console.log(a); //123
var glob = 100;
a();
**三function a(){
function b(){
function c(){
c();
b();
a();
**三**說明
a defined a.[[scope]] ----> 0:go
a doing a.[[scope]] ----> 0:aao
1:go
b defined b.[[scope]] ----> 0:aao
1:go
b doing b.[[scope]] ----> 0:bao
1:aao
2:go
c defined c.[[scope]] ----> 0:bao
1:aao
2:go
c doing c.[[scope]] ----> 0:cao
1:bao
2:aao
3:go
作用域和作用域鏈
全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...
作用域和作用域鏈
var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...
作用域和作用域鏈
執行環境定義了變數和函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有與之對應的變數物件 variable object 儲存著該環境中定義的所有變數和函式。我們無法通過 來訪問變數物件,但是解析器在處理資料時會在後台使用到它。執行環境有全域性執行環境 也稱全域性環境 和函式執行環境之分...