潛談函式作用域和作用域鏈

2021-09-29 13:20:05 字數 2024 閱讀 1883

全域性作用域

區域性作用域

1、全域性作用域

定義:在js的任意地方都可以獲取和使用

(1)最外面的定義的變數就擁有全域性作用域

var a = 1;

function test()

console.log(a);//1

(2)任何變數,如果沒有宣告就賦值,此變數會為全域性物件所有

function test()

test();

console.log(b);//1

(3)window物件的內建屬性擁有全域性作用域

特殊情況

var a= 1;

function fn()

fn();

這裡雖然定義有全域性變數,但是js有乙個定義,只要函式體定義了乙個區域性變數,函式在解析的時候都會將這個變數「提前宣告」,這就是變數的提前宣告,這裡函式體內的var a宣告到外面重新覆蓋,所以再列印結果就是undefined,在賦值下面再列印,這裡函式體拿到空的變數a再賦值就有了結果

var a;

function fn()

fn();

2、區域性作用域定義:在乙個區域性的範圍內可以獲取和使用,比如函式體

function test()

console.log(b);//報錯

每個函式體執行時都會產生乙個執行環境,js為執行環境設定了乙個變數物件。環境中定義的所有變數和函式體都存在這個環境棧中。

全域性執行環境被認為是window物件,上面有講過window物件的內建屬性擁有全域性作用域,因此所有的全域性變數和函式都作為window物件的屬性建立的。

函式也是物件,擁有可以通過(prototype)查詢的物件的屬性方法和一些內部屬性。其中有乙個叫[[scope]]的內部屬性,該內部屬性包含了函式被建立的作用域中物件的集合,這個集合被稱為函式的作用域鏈。

*當某個環境中的所有**執行完畢後,該環境會從環境棧中刪除,包含這個環境中的變數和函式體

1:語法分析:有錯誤的丟擲異常,餘下**不執行

2:預編譯

3:執行**

1、建立ao物件(activition object)

2、找形參和變數宣告,將變數和形參名作為ao屬性名,所有屬性名賦予的初始值均為undefined

3、將實參值和形參統一

4、在函式體裡面找函式宣告,值賦予函式體

function fn(a);

}fn(1);

根據步驟:

第一步:建立ao物件

ao
第二步:找形參和變數宣告,將變數和形參名作為ao屬性名,所有屬性名賦予的初始值均為undefined

ao
第三步:將實參值和形參統一

ao
第四步:在函式體裡面找函式宣告,值賦予函式體

ao,

}

開始執行**

function fn(a);

console.log(a);//function a(){} 找到函式體,提前賦值給a

var a = 2;

console.log(a);//2 對a進行重新賦值

}fn(1);

函式作用域和作用域鏈

所謂作用域就是 變數在宣告它們的函式體以及這個函式體巢狀的任意函式體內都是有定義的。function scope while 1 function console.log foo,global a,i m if b,i m while c c is not defined scope 但是,在js中...

作用域和作用域鏈

全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...

作用域和作用域鏈

var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...