1,js 分為兩種數(shù)據(jù)類(lèi)型:
- 基本數(shù)據(jù)類(lèi)型:是按照值來(lái)操作的
number string boolean null undefined;
- 引用數(shù)據(jù)類(lèi)型:是按照引用的地址來(lái)操作的
object:對(duì)象,數(shù)組,正則,時(shí)間
function
引用類(lèi)型:存儲(chǔ)的是數(shù)據(jù)在內(nèi)存中的地址,數(shù)據(jù)庫(kù)在內(nèi)存中單獨(dú)存儲(chǔ),就是引用類(lèi)型的數(shù)據(jù)
2,JS 預(yù)解釋 的內(nèi)存分類(lèi):
- 棧內(nèi)存:用來(lái)提供一個(gè)JS代碼執(zhí)行的環(huán)境;->作用域(全局作用域,私有作用域)
- 堆內(nèi)存:用來(lái)存儲(chǔ)引用數(shù)據(jù)類(lèi)型的值;->對(duì)象存儲(chǔ)的是屬性名和屬性值,函數(shù)存儲(chǔ)的是代碼字符串
注:當(dāng)瀏覽器加載html頁(yè)面是,會(huì)先提供一個(gè)全局 js 代碼執(zhí)行的環(huán)境,棧內(nèi)存
3,全局作用域 與 私有作用域
全局作用域:當(dāng)瀏覽器提供全局js代碼執(zhí)行的環(huán)境
私有作用域:當(dāng)函數(shù)代碼執(zhí)行時(shí),會(huì)形成一個(gè)私有的作用域
所有的作用域 都是棧內(nèi)存
4,預(yù)解釋
1,在當(dāng)前的作用域中,js 代碼執(zhí)行前,瀏覽器會(huì)默認(rèn)把所有帶 var 和 function 進(jìn)行提前申明和定義
var num = 12;
`申明`:var num告訴瀏覽器在全局作用域中有一個(gè) mun 的變量;只是聲明了,但是沒(méi)有定義
`定義`:num=12給我們變量進(jìn)行賦值
2,預(yù)解釋執(zhí)行環(huán)境:只有在函數(shù)執(zhí)行時(shí)候才會(huì)進(jìn)行預(yù)解釋。
3,在預(yù)解釋時(shí)候執(zhí)行的操作
var :只是提前聲明
function:提前聲明+定義都會(huì)完成,函數(shù)中return后面的代碼雖然不執(zhí)行,但是要預(yù)解釋
* 自執(zhí)行函數(shù)在全局作用域下是不進(jìn)行預(yù)解釋的,執(zhí)行到此,聲明和定義都完成了 *
4,全局變量 與 私有變量
全局變量:在全局作用域下申明的變量
私有變量:在私有作用域下申明的變量與函數(shù)的形參
5,代碼執(zhí)行的步驟:
- 有形參,先給形參賦值
- 進(jìn)行私有作用域中的預(yù)解釋
- 私有作用域中代碼從上到下執(zhí)行
6,全局變量,帶var 與不帶的區(qū)別
num=12;不進(jìn)行預(yù)解釋?zhuān)喈?dāng)于給window添加了一個(gè)num的屬性名,屬性值12
var num=12;進(jìn)行預(yù)解釋?zhuān)粌H給window添加了一個(gè)num的屬性名,屬性值12,也添加了一個(gè)全局變量
js 中出錯(cuò)不進(jìn)行特殊處理,出錯(cuò)代碼以下代碼不進(jìn)行執(zhí)行
5,作用域鏈
1,作用域鏈:遇到一個(gè)變量,現(xiàn)在私有作用域查找,查不到再到全局作用域下找,找不到一直向上級(jí)作用域查找,一直找到window為止;
2,閉包:函數(shù)形成一個(gè)新的私有的作用域保護(hù)里面的私有變量不受外部干擾(外部修改不了私有的,私有的也修改不了外部的)
6,如何查找上一級(jí)作用域
看函數(shù)在那個(gè)作用域下定義的,它的作用域就是誰(shuí)=>與函數(shù)在哪里執(zhí)行的沒(méi)有任何關(guān)系
7,釋放內(nèi)存與作用域銷(xiāo)毀
1,讓堆內(nèi)存銷(xiāo)毀/釋放:讓引用他的變量值賦值為 null ;
2,讓堆內(nèi)存銷(xiāo)毀/釋放:
全局作用域:只有當(dāng)頁(yè)面關(guān)閉時(shí),全局作用域才銷(xiāo)毀
私有作用域:當(dāng)私有作用域代碼執(zhí)行完了,私有作用域才會(huì)主動(dòng)進(jìn)行銷(xiāo)毀;當(dāng)私有作用域中的部分內(nèi)存被作用域以外東西占用,那么久不進(jìn)行銷(xiāo)毀
私有作用域不能被銷(xiāo)毀情況
1,函數(shù)執(zhí)行返回一個(gè)引用數(shù)據(jù)類(lèi)型值,并且在函數(shù)外部被一個(gè)變量接受,這種情況私有作用域不可以銷(xiāo)毀
2,在私有作用域中給 DOM 元素事件綁定方法,私有作用域不可進(jìn)行銷(xiāo)毀
`只有函數(shù)執(zhí)行時(shí),才會(huì)產(chǎn)生私有作用域`
8,預(yù)解釋是一種毫無(wú)節(jié)操的機(jī)制
1,in:‘num’ in window 判斷是否為window這個(gè)對(duì)象的一個(gè)屬性,是的話返回 true,不是的話返回 false,但是在判斷中,就已經(jīng)預(yù)解釋了,所以 'num' in window 判斷為 true
if(! ('num' in window) ){ //這里可以進(jìn)行判斷 window是都有這個(gè)屬性名
var num=12;// 不是window 屬性,則給 num 賦值
console.log( num )
}