javascript變量提高和函數提高


變量提高

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");
};
相關文章
相關標籤/搜索