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