預解析:在當前作用域下,js運行之前,會把帶有var和function關鍵字的事先聲明,并在內存中安排好。然后再從上到下執行js語句。
預解析只會發生在通過var定義的變量和function上。
var通過var關鍵字定義的變量進行預解析的時候:都是聲明declare,不管它有沒有賦值,都會賦值undefined。
alert(a); //undefined var a = 1; alert(b); //undefined var b = function(){ } alert(c); //undefined var c; 只要是通過var定義的,不管是變量,還是函數,都是先賦值undefined,如果是變量,也不管變量有沒有賦值,在預解析階段,都是會被賦值為undefined。
functionfunction進行預解析的時候,不僅是聲明而且還定義(define)了,但是它存儲的數據的那個空間里面存儲的是代碼是字符串,沒有任何意義。
alert(a); //彈出的是下面的function function a(){ alert(“預解析function”) } 注意這種情況
定義一個函數想要立即執行,寫成如下形式是不可行的,在預解釋的時候,它把它分解成兩部分來對待,第一部分是fn函數,而第二部分是(),一個匿名函數,執行時會報錯。如果小括號帶參數,如(2),雖然不會報錯,會打印出來2,但并不能把fn執行,也不能當成參數傳遞給fn函數。
function fn(){ //代碼區 }() 如果你想實現立即執行的函數,可以把要執行的函數放到一對括號里面,對于javaScript 來說,括弧()里面不能包含語句,所以在這一點上,解析器在解析function關鍵字的時候,會將相應的代碼解析成function表達式,而不是function聲明所以,只要將大括號將代碼(包括函數部分和在后面加上一對大括號)全部括起來就可以了。 如下:
(function fn(){ //代碼區… }()) 還可以寫成:閉包。
(function(){ //代碼區… })(); 4. 預解析需要注意的情況
預解析是發生在當前作用域下的,剛開始的時候,我們預解析的是全局作用域,在js中我們的global就是我們的window。 我們運行函數的時候會生成一個新的私有作用域(每次執行都是新的,執行完成就銷毀)這個作用域下我們可以理解為開辟了一個新的內存空間。在這個內存中我們也要執行預解析。當我們的函數執行完成后,這個內存或者作用域就會銷毀 如果在當前作用域下的一個變量沒有預解析,就會向它的上一級去找,直到找到window,如果window下也沒有定義,就會報錯。所以,在函數內通過var定義的變量是局部變量,沒有能過var 定義的變量是全局變量。 預解析不會在同一個變量上重復的發生,也就是一個變量如果已經在當前作用域下預解析了,不會再重復解析。 等號右邊的function不會進行預解析。 alert(a); fn(); var a = function fn(){}; 第一次打印undefined,第二次報錯,未定義,因為預解析的時候,=號右邊是不進行預解析的。
預解釋是不受其它if或者其它判斷條件影響的,也就是說,即使條件不成立,我們里面只要有var或者function也會被預解釋。if,while alert(a); //undefined if(1==2){ var a=12; } 后面定義的會覆蓋前面定義的 alert(a); //彈出后面的function function a(){ var b; } alert(a); //仍然彈出后面的function,因為function是提前預解析的 function a(){ var c; } Javascript“預解析”是分段進行的,準確說是分
新聞熱點
疑難解答