預(yù)解釋:在當(dāng)前的作用域中胚膊,js代碼執(zhí)行之前,瀏覽器首先會默認(rèn)把所有的帶var、function的進(jìn)行提前的聲明和定義朴肺。
1.對于帶var和function關(guān)鍵字在預(yù)解釋的時候是不一樣
(1)var 在預(yù)解釋的時候只是提前的聲明
(2)function 在預(yù)解釋的時候是提前聲明和定義都完成了
預(yù)解釋只發(fā)生在當(dāng)前的作用域下,例如只對window下進(jìn)行的預(yù)解釋坚洽,只有函數(shù)執(zhí)行的時候才會對函數(shù)進(jìn)行預(yù)解釋戈稿。
2.預(yù)解釋的時候不管條件是否成立,都要把帶var的進(jìn)行提前的聲明
// window的預(yù)解釋:var num; window.num
if ( !('num' in window)) { // 'num' in window ->true
var num = 12
}
console.log(num) // undefined
3.預(yù)解釋的時候只解釋 ‘=’左邊的讶舰,右邊的是值鞍盗,不參與預(yù)解釋
匿名函數(shù)之函數(shù)表達(dá)式:把函數(shù)定義的部分當(dāng)做一個值賦值給我們的變量/元素的某一個事件
fn()// 這時候執(zhí)行fn()的時候回報錯需了,因?yàn)轭A(yù)解釋的時候var fn; 相當(dāng)于是undefined() 所以fn這時候不是一個函數(shù)會報錯
var fn = function () {
console.log(12)
}
4.自執(zhí)行函數(shù)定義的那個function 在全局作用域下是不進(jìn)行預(yù)解釋的,當(dāng)代碼執(zhí)行到這個位置的時候定義和執(zhí)行一起完成了
自執(zhí)行函數(shù):定義和執(zhí)行一起完成
(function (num) {})(100)
+function (num){}(200)
!function (num){}(300)
5.函數(shù)體中return 下面的代碼雖然不執(zhí)行了般甲,但是還會進(jìn)行預(yù)解釋肋乍;return后面跟著的都是返回的值,所以不進(jìn)行預(yù)解釋
function fn (){
console.log(num) //undefined 預(yù)解釋:var num;
return function () {}
var num = 12
}
fn ()
6.在預(yù)解釋的時候敷存,如果名字已經(jīng)聲明過了不需要重新聲明墓造,但是需要重新賦值在js中如果變量的名字和函數(shù)的名字重復(fù)了,也算沖突.
fn() // 20
function fn () { console.log(12) }
fn() //20
var fn = 10; // fn = 10
fn() // 報錯 fn is not function
function fn () { console.log(20) }
fn()
/***
window預(yù)解釋
聲明+定義 fn = xfff1111 //是執(zhí)行12的那個函數(shù)历帚;
聲明 var fn滔岳;
聲明(因?yàn)橐呀?jīng)有函數(shù)fn了,這時候就不重復(fù)聲明了挽牢,只有賦值)+定義 fn = xfff222 // 是執(zhí)行20的那個函數(shù)
fn = xffff222
***/