發佈自 Kindem的博客,歡迎你們轉載,可是要注意註明出處。另外,該文章收納在 Kindem的我的的 IT 知識整理倉庫,歡迎 Star、Fork、投稿
變量提高Hoisting
是人們對JavaScript
執行上下文工做方式的一種認識,並非官方給出的改變javascript
從字面上理解,變量提高的意思是變量和函數的聲明會在物理層移動到做用域的最前面。可是這樣理解並不許確,效果是相同的,可是實際的實現方式是JavaScript
的變量和函數的聲明會在編譯階段放入內存java
這意味着使用者在正式聲明一個函數或者變量以前就可以使用它git
在JavaScript
中,在聲明一個函數前,咱們就可以使用它,你們應該都體驗過,像這樣:github
test(); function test() { // do something }
在正常的使用狀況下,應該須要先聲明函數才能調用,可是這種方法仍然可以運行,這是由於JavaScript
自動將函數聲明事先存入了內存的緣由,看起來就像JavaScript
自動把函數聲明提高到了最前面函數
對於變量,JavaScript
使用相似的方法,可是要注意一點的是,對於變量的提高,JavaScript
只會將變量聲明提高,可是不會把初始化提高,若是在變量初始化以前使用,則會獲得undefined
code
// undefined console.log(a); // ReferenceError: b is not defined console.log(b); var a = 10;
// undefined console.log(num); num = 6; // 6 console.log(num); num += 7; // 13 console.log(num); var num;
// undefined console.log(num); num = 1; // 1 console.log(num); var num = 2; // 2 console.log(num);
這裏要注意,JavaScript
的變量提高是針對var
的,而let
和const
不存在變量提高這一特性ip
// ReferenceError: a is not defined console.log(a); let a = 10;
var a = 100; function fn() { // undefined console.log(a); var a = 200; // 200 console.log(a); } fn(); // 100 console.log(a); var a; // 100 console.log(a); // 300 var a = 300; console.log(a);