Variable hoisting變量提高是js比較有特色的地方,它容許你先使用變量,在其後面再進行變量聲明,不會拋出 Uncaught ReferenceError異常。雖然變量被提高到前面,可是它的默認值則是undefind,在引用的時候也使用這個值,知道在其面後進行賦值,在使用時候即爲所贖的值。javascript
舉個例子:java
console.log(x) //若是後面不定義x 則拋出"ReferenceError: x is not defined //若是後面對x定義 則打印出undefined var x = 2 var abc = "abcd"; (function(){ console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })() //上面代碼能夠這樣翻譯 var x; console.log(x)//undefined var x = 2 var abc = "abcd"; (function(){ var abc; console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })()
基於這個緣由,在平時編寫代碼時候,儘可能把變量聲明放到代碼塊最頂層位置,能夠使代碼結構清晰。
注意的是,在ES6語法中新增的let or const 聲明方式,並不支持這種變量提高,強行使用會拋出錯誤ReferenceError瀏覽器
對於函數提高,只用函數的聲明被提高,表達式則不會被提高函數
/* 函數聲明 */ foo(); // "bar" function foo() { console.log("bar"); } /* 函數表達式 表達式定義的函數,稱爲匿名函數。匿名函數沒有函數提高。*/ baz(); // TypeError: baz is not a function //此時的"baz"至關於一個聲明的變量,類型爲undefined。 因爲baz只是至關於一個變量,所以瀏覽器認爲"baz()"不是一個函數。 var baz = function() { console.log("bar2"); };