什么是作用域
作用域規(guī)定了當(dāng)前執(zhí)行代碼對(duì)變量的訪問(wèn)權(quán)限
作用域最大的作用就是變量隔離,不同作用域下的同名變量不會(huì)有沖突
全局作用域
1.最外層函數(shù)和最外層函數(shù)外面定義的變量擁有全局作用域
2.未定義直接賦值的變量自動(dòng)聲明擁有全局作用域
弊端:
污染全局命名空間,容易引起命名沖突
函數(shù)作用域
指聲明在函數(shù)內(nèi)部的變量,只在固定的代碼片段能夠訪問(wèn)到
塊級(jí)作用域
可以通過(guò)新增的let 、const聲明,塊級(jí)作用域在如下情況被創(chuàng)建
在一個(gè)函數(shù)內(nèi)部
在一個(gè)代碼塊(由一對(duì)花括號(hào)包裹)內(nèi)部
塊級(jí)作用域聲明的變量不會(huì)提升到代碼塊頂部
作用域鏈
自由變量
需要用到某個(gè)變量,但是在當(dāng)前作用域中沒(méi)有定義這個(gè)變量,這個(gè)變量稱為自由變量。
自由變量的值通過(guò)向父級(jí)作用查找得到
什么是作用域鏈
向父級(jí)作用域找,沒(méi)找到,再一層一層向上尋找,直到全局作用域。這一層一層的關(guān)系就是作用域鏈
查找某個(gè)自由變量,是要去創(chuàng)建這個(gè)函數(shù)的作用域取值,而不是調(diào)用。--靜態(tài)作用域
作用域與執(zhí)行上下文
JavaScript屬于解釋型語(yǔ)言,JavaScript的執(zhí)行分為:解釋和執(zhí)行兩個(gè)階段。
解釋階段
詞法分析
語(yǔ)法分析
作用域規(guī)則確定
執(zhí)行階段
創(chuàng)建執(zhí)行上下文
執(zhí)行函數(shù)代碼
垃圾回收
執(zhí)行上下文在運(yùn)行時(shí)確定,隨時(shí)可能改變;作用域在定義時(shí)就確定,并且不會(huì)改變。