預(yù)解析
- 可以理解為js解析引擎在逐行執(zhí)行代碼前餐禁,對一些特殊代碼的預(yù)先執(zhí)行。
- 也可以認(rèn)識是在馬拉松之前的熱身運動。
- 具體一點講,是js在逐行執(zhí)行代碼前,會對js腳本進行一個整體檢查背桐。
- 1、檢測語法有沒有錯誤
- 2畦娄、變量聲明提升:檢測到變量聲明那就率先進行聲明(實際上是開辟一個內(nèi)存空間弊仪,將來備用)
- 3、函數(shù)聲明提升:檢測到函數(shù)聲明也率先進行聲明(實際上是開辟兩個內(nèi)存空間役听,一個是變量表窘,一個是函數(shù))
- 預(yù)解析造成js一個特殊的象限,就是在變量聲明和函數(shù)聲明之前的代碼艾扮,可以訪問它們填物。
- js預(yù)解析完畢之后击困,才會整體正式逐行執(zhí)行广凸,但是預(yù)解析過的變量聲明和函數(shù)聲明不會重復(fù)執(zhí)行谅海。
- js預(yù)解析分為兩種,全局預(yù)解析(全局代碼執(zhí)行的時候會先預(yù)解析)與局部預(yù)解析(函數(shù)在調(diào)用的時候內(nèi)部的代碼會先預(yù)解析)
變量聲明
- 使用通過var定義的變量侥袜,才屬于變量聲明
- 例如:var a; 屬于變量聲明。
- 例如:b = 10; 不屬于變量聲明浦旱。
- var關(guān)鍵字可以通過逗號連續(xù)聲明多個變量
- 例如:var a, b, c = 20, d = 30;
- a,b,c,d全部屬于聲明九杂。
- var關(guān)鍵字在聲明變量的時候代兵,可以給其賦值爷狈,如果賦值表達式中含有一些變量裳擎,這些變量不屬于變量聲明。
- 例如:var a = b = 10;
- 其中a屬于變量聲明羡微,b不屬于惶我。
函數(shù)的定義方式
- 字面量
- 函數(shù)聲明
- function fn(){}
- 函數(shù)表達式
- var fn = function(){}
- 函數(shù)聲明
- 構(gòu)造函數(shù)
- new Function()
函數(shù)聲明
在js中,函數(shù)聲明式寫法比較單一绸贡,好區(qū)分。
- 一定是以function關(guān)鍵字開頭定義的函數(shù)
- 一定具有函數(shù)名
- 函數(shù)聲明有兩種捧挺,1種是全局函數(shù)聲明尿瞭,1中是局部函數(shù)聲明
- 函數(shù)聲明要么在全局,要么直接嵌套在另一個函數(shù)內(nèi)
函數(shù)表達式
在js中黑竞,函數(shù)表達式的編寫形式疏旨,多種多樣。
比如把函數(shù)當(dāng)作數(shù)據(jù)賦值給變量充石,或者把函數(shù)作為返回值return,或者當(dāng)做參數(shù)傳遞拉岁,或者運算符運算惰爬,或者自調(diào)函數(shù)。
- 要么不是以function關(guān)鍵字開頭來定義的函數(shù)陵叽,要么該函數(shù)定義在了語句當(dāng)中
- 函數(shù)名可有可無
預(yù)解析細(xì)節(jié)規(guī)則
- 變量聲明重名 -- 后面的忽略,沒有必要定義重復(fù)的變量
- 函數(shù)聲明重名 -- 保留后面的巩掺,因為函數(shù)體可能不一樣,后面的優(yōu)先與前面的
- 變量與函數(shù)重名 -- 保留函數(shù)
- 寫在代碼塊中的函數(shù)研儒,名字會被預(yù)解析独令,函數(shù)體不會
- 最終造成的現(xiàn)象是,在該函數(shù)定義的訪問它冲呢,不會報錯招狸,得到一個undefined
console.log(fn) // undefined
if(true) {
function fn(){}
}
console.log(fn) // 函數(shù)體
- 函數(shù)表達式不會被預(yù)解析,但是函數(shù)表達式定義的函數(shù)執(zhí)行時裙戏,其內(nèi)部會對自己進行函數(shù)聲明。
- 最終造成的現(xiàn)象是翰意,在該函數(shù)的外面無法通過其名稱找到它信柿,但是在內(nèi)部可以。
console.log(fn); // 報錯
var a = function fn(){
console.log(fn); // 函數(shù)體进鸠,因為表達式定義的函數(shù)形病,會在自己內(nèi)部被聲明一次。
}
console.log(fn); // 報錯
函數(shù)執(zhí)行時形參的賦值
- 一個函數(shù)在執(zhí)行時漠吻,會優(yōu)先定義形參,然后賦值绍傲。
- 預(yù)解析和逐行執(zhí)行都慢與形參。
(function(a) {
console.log(a); // 100
var a = 200;
console.log(a); // 200
}(100));
閉包
- 有權(quán)訪問非自身局部變量(非全局變量)的函數(shù)猎塞,稱為閉包杠纵。
- 有權(quán)訪問自由變量(非全局變量)的函數(shù),稱為閉包比藻。
自由變量
- 一個函數(shù)可以訪問的非自身內(nèi)部變量,稱為這個函數(shù)的自由變量韩容。
引用了自由變量的閉包特點
- 會延長自由變量的生命周期唐瀑,只要閉包不死我就不死
閉包的應(yīng)用
- 可以利用閉包的結(jié)構(gòu)去管理一些重要的變量,防止外界隨意對其修改