知識點
-
var
聲明的變量在預(yù)解析的時候只執(zhí)行聲明晚碾,不會執(zhí)行定義掌挚,默認值是 undefined
姚炕。
-
function
聲明的函數(shù)在預(yù)解析的時候會提前聲明并且會同時定義掂器。
- 變量名重復(fù)聲明無效
- 預(yù)解析過得代碼不會再執(zhí)行階段執(zhí)行
示例一
console.log(a); // 打印函數(shù)a函數(shù)體(function a() { console.log('a') })
var a = 10;
console.log(a); // 10
function a() { console.log('a') }
console.log(a); // 10
預(yù)解析過程
- 首先預(yù)解析到有變量
a
存在亚皂,因此記錄下 a
這個名字,和其值 undefined
- 接著預(yù)解析到有函數(shù)
a
聲明唉匾,記錄下函數(shù)名 a
- 但是發(fā)現(xiàn)已經(jīng)記錄了一個
a
孕讳,因此該操作無效,將函數(shù)體與 a
這個名字相關(guān)聯(lián)
- 解析完畢
預(yù)解析過程代碼
a = undefined
a = function () { console.log('a') }
預(yù)解析結(jié)果
a = function () { console.log('a') }
執(zhí)行過程
- 打印變量
a
的值 function a() { console.log('a') }
- 變量
a
賦值為10巍膘,將原來關(guān)聯(lián)的函數(shù)覆蓋
- 打印變量
a
的值 10
- 打印變量
a
的值 10
- 執(zhí)行完畢
執(zhí)行過程代碼
console.log(a)
a = 10
console.log(a)
console.log(a)
示例二
console.log(fn) // 函數(shù)fn函數(shù)體(function fn() { console.log(2) })
function fn() { console.log(1) }
console.log(fn) // 函數(shù)fn函數(shù)體(function fn() { console.log(2) })
var fn = 10
console.log(fn) // 10
function fn() { console.log(2) }
console.log(fn) // 10
預(yù)解析過程
- 首先預(yù)解析到有函數(shù)
fn
聲明厂财,因此記錄 fn
這個名字,并關(guān)聯(lián)其函數(shù)體
- 接著預(yù)解析到變量
fn
聲明峡懈,記錄下變量名 fn
- 但是發(fā)現(xiàn)已經(jīng)記錄了一個
fn
璃饱,因此該操作無效
- 接著預(yù)解析到有函數(shù)
fn
聲明,因此記錄 fn
這個名字
- 但是發(fā)現(xiàn)已經(jīng)記錄了一個
fn
肪康,因此該操作無效荚恶,接著關(guān)聯(lián)其函數(shù)體
- 解析完畢
預(yù)解析過程代碼
fn = function () { console.log(1) }
fn = function () { console.log(2) }
預(yù)解析結(jié)果
fn = function () { console.log(2) }
執(zhí)行過程
- 打印變量
fn
的值 function fn() { console.log(2) }
- 打印變量
fn
的值 function fn() { console.log(2) }
- 變量
fn
賦值為10撩穿,將原來關(guān)聯(lián)的函數(shù)覆蓋
- 打印變量
fn
的值 10
- 打印變量
fn
的值 10
- 執(zhí)行完畢
執(zhí)行過程代碼
console.log(fn)
console.log(fn)
fn = 10
console.log(fn)
console.log(fn)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者