預解釋:在當前的作用域中,js代碼執(zhí)行之前,瀏覽器首先會默認把所有的帶var、function的進行提前的聲明和定義。
1.對于帶var和function關鍵字在預解釋的時候是不一樣
(1)var 在預解釋的時候只是提前的聲明
(2)function 在預解釋的時候是提前聲明和定義都完成了
預解釋只發(fā)生在當前的作用域下,例如只對window下進行的預解釋,只有函數(shù)執(zhí)行的時候才會對函數(shù)進行預解釋。
2.預解釋的時候不管條件是否成立,都要把帶var的進行提前的聲明
// window的預解釋:var num; window.num
if ( !('num' in window)) { // 'num' in window ->true
var num = 12
}
console.log(num) // undefined
3.預解釋的時候只解釋 ‘=’左邊的,右邊的是值,不參與預解釋
匿名函數(shù)之函數(shù)表達式:把函數(shù)定義的部分當做一個值賦值給我們的變量/元素的某一個事件
fn()// 這時候執(zhí)行fn()的時候回報錯,因為預解釋的時候var fn; 相當于是undefined() 所以fn這時候不是一個函數(shù)會報錯
var fn = function () {
console.log(12)
}
4.自執(zhí)行函數(shù)定義的那個function 在全局作用域下是不進行預解釋的,當代碼執(zhí)行到這個位置的時候定義和執(zhí)行一起完成了
自執(zhí)行函數(shù):定義和執(zhí)行一起完成
(function (num) {})(100)
+function (num){}(200)
!function (num){}(300)
5.函數(shù)體中return 下面的代碼雖然不執(zhí)行了,但是還會進行預解釋;return后面跟著的都是返回的值,所以不進行預解釋
function fn (){
console.log(num) //undefined 預解釋:var num;
return function () {}
var num = 12
}
fn ()
6.在預解釋的時候,如果名字已經(jīng)聲明過了不需要重新聲明,但是需要重新賦值在js中如果變量的名字和函數(shù)的名字重復了,也算沖突.
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預解釋
聲明+定義 fn = xfff1111 //是執(zhí)行12的那個函數(shù);
聲明 var fn;
聲明(因為已經(jīng)有函數(shù)fn了,這時候就不重復聲明了,只有賦值)+定義 fn = xfff222 // 是執(zhí)行20的那個函數(shù)
fn = xffff222
***/