JS深入理解作用域 作用域鏈,變數提公升

2021-10-06 16:01:03 字數 2270 閱讀 8881

1、作用域

(1)全域性作用域:在瀏覽器載入我們html頁面的時候,首先會開闢乙個供js**執行的環境,即全域性作用域,這是乙個棧記憶體

(2)私有作用域:函式執行時,開闢乙個新的棧記憶體,形成私有作用域

2、基本資料型別與引用資料型別區別?

基本資料型別:string,number,boolean,null,undefined,直接將變數值儲存在棧中

引用資料型別:將指標儲存在棧中,指標指向堆記憶體

3、變數提公升(js執行之前,瀏覽器將var提前宣告為undefined,將function提前宣告和定義)

變數提公升只發生在當前作用域:

(1)開始載入頁面時,只對全域性變數進行提公升,在函式內的宣告的變數不被提公升。

(2)執行函式時,私有作用域形成後,先形參賦值,然後變數提公升,最後執行**

4、帶var和不帶的區別 ----作用域鏈

(1)全域性作用域下:

不加var是window的乙個屬性,不是變數,不會被變數提公升

window下的屬性與全域性變數存在對映,全域性變數會被賦值給window物件相同屬性

console.

log(a)

;//undefined

console.

log(b)

;//報錯,沒有這個變數,也沒有被提公升宣告

var a =12;

// a會被變數提公升,window.a也為12

b =5

= 5;window的b屬性為5

console.

log(window.b)

;//5

console.

log(b)

;//5

(2)私有作用域下,是否帶var的區別

帶var是私有作用域下的變數,函式執行時,剛進去函式體會被提公升,和外界無關。

不帶var不是私有變數,會像上級逐級查詢,直到找到或到window(此查詢機制叫做「」作用域鏈「」),在私有作用域下操作不帶var的變數,是在操作外界

console.

log(a,b)

;// undefined undefined 全域性變數被提公升

var a =

12,

b =12;

//逗號為縮寫

functionfn(

)fn()

;console.

log(a,b)

;//12 13 全域性a仍然為12,window.b在方法內被修改為13

5、特殊情況的變數提公升

(1)匿名函式被變數提公升為undefied(只提公升等號左邊)

a()

;//a 經過變數提公升,可以執行b(

);//報錯,因為匿名函式會被變數提公升為undefied,not a function

functiona(

)varb=

function()

(2)新增判斷下的變數提公升

不管判斷條件是否成立,都會進行變數提公升

帶var的還是只宣告,帶function的老版本宣告加提公升,新版本瀏覽器(為迎合es6塊級作用域),只宣告,不定義

console.

log(a)

//undefined

console.

log(fn)

//undifinedif(

1==2)

}console.

log(fn)

// 函式本身

console.

log(fn2)

//undifinedif(

1==1)

}

6、es6中let和const不存在變數提公升

7、堆疊記憶體的釋放

堆記憶體:引用堆記憶體的變數賦值為null即可(沒有變數占用這個堆記憶體,瀏覽器空閒時候會釋放掉)

棧記憶體:一般情況下,函式執行完,所形成的私有作用域(棧記憶體)會自動釋放掉,以下情況例外:

(1)函式執行完,形成的棧記憶體中內容被外界變數占用,此時棧記憶體不能被釋放

(2)全域性棧內存在頁面關閉才會被釋放

理解作用域鏈

先來看兩個例子 var x 10 bar 10 function foo function bar 解析 執行bar,相當於執行foo foo裡面要輸出x,我們首先要從foo自己的作用域下面去找 foo裡邊是沒有宣告x的,然後我們會到foo的詞法作用域去找,也就是宣告foo的作用域去找。在這裡foo...

js深入理解之作用域鏈

語法分析,分析3樣東西 第1步 先分析引數 第2步 再分析變數宣告 第3步 分析函式宣告 乙個函式能使用的區域性變數,就從上面的3步分析而來 具體步驟 0 函式執行前的1瞬間,生成 active object 活動物件 下稱ao 1 1.1 函式宣告的引數,形成ao的屬性,值全是undefined,...

如何理解作用域鏈

在js中作用域是什麼?何為作用域 任何程式語言都有作用域的概念,簡單來說,作用域就是變數與函式的可訪問範圍,即作用域控制著變數與函式的可見性和生命週期。js的作用域是靠函式來形成的,也就是說乙個函式的變數在函式外不可以訪問。1全域性作用域也就是go 任何地方都能訪問到的物件擁有全域性作用域。1.1函...