預解析:在當前作用域下,js運行之前,會把帶有var和function關鍵字聲明的變量先聲明,并在內(nèi)存中安排好。然后從上至下解析js語句。而且function的聲明優(yōu)先于var聲明。
通過var聲明的變量,進行預解析的時候:先聲明變量,不管變量有沒有賦值,聲明時都賦值為undefined。
console.log(a); //undefinedvar a = 1;console.log(b); //undefinedvar b = function(){}注意: (1)同名的var聲明和同名的函數(shù)聲明,不管二者書寫先后順序,函數(shù)聲明會覆蓋掉var聲明的變量; (2)同名的var聲明,后者會被忽略; (3)同名的函數(shù)聲明,后者會覆蓋前面的
console.log(a) //function a(){} var a = 10; console.log(a) //10 var a = 20; console.log(a) //20 var a = function () { // body... } console.log(a) //function(){} function a(){} console.log(a) //function(){} /*若在此處加下面的聲明*/ /* function a(name){this.name = name} */ //則最上面的a輸出:function a(name){this.name = name}function進行預解析的時候,不僅是聲明而且還定義了函數(shù)體,在內(nèi)存中會開辟一塊內(nèi)存空間,存儲的是函數(shù)體的字符串,不會執(zhí)行。調(diào)用以后執(zhí)行。
console.log(a) //function a(name){this.name = name}function a(name){this.name = name}注意:直接在函數(shù)后面加(),會報錯。這樣的函數(shù)聲明時,先聲明函數(shù),然后聲明(),這個()是匿名函數(shù),聲明會報錯
function a(){}() //報錯(1)預解析,不會超出script標簽
<script> console.log(a) // 報錯</script><script>function a(){}</script>(2)后面script標簽中可以訪問呢前面script標簽中的js,因為js是從上至下執(zhí)行的
<script> function a(){} var a = 10</script><script> console.log(a) //10</script>(3)匿名函數(shù)可以帶名字,但是不等同于定義了一個函數(shù)
console.log(a) //undefined fn() //報錯 var a = function fn (argument) { // body... }(4)函數(shù)內(nèi)部同名變量額聲明高于傳入的同名參數(shù)
var a = 10function fn(a){ var a = 20 console.log(a)//20}fn(a)var a = 10function fn(a){ console.log(a)//undefined}fn() //因為調(diào)用時,沒有穿參數(shù)(5) 函數(shù)內(nèi)參數(shù)的聲明高于外部同名變量的聲明
var a = 10 function fn (a){ console.log(a)//undefined } fn()而
var a = 10 function fn (b){ console.log(a) // 10 } fn()或者
var a = 10 function fn (){ console.log(a) // 10 } fn()新聞熱點
疑難解答
圖片精選