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函...