淺談JS聲明提早

聲明提早這個概念對於前端攻城獅來講是一個很瞭解的了,可是對於初入前端的新人來講,這又是一個不得不談的話題前端

下面我將介紹一下什麼是聲明提早函數

1 console.log(a);               //undefined
2 var a;
3 a=10;
4 console.log(a)                //10;

如上面代碼所示,在我並未定義a時,試着輸出a,js並無報錯,而是用undefined顯示,spa

在第4行輸出a時結果是正確顯示的,第一行爲何不報錯呢?code

緣由是這樣的,在js中存在這樣一種機制,在程序正式執行以前,會將var聲明的變量function聲明的函數預讀到當前做用域的頂部blog

js中的做用域我會在後面的章節中詳細去寫,在這裏你們只須要先將做用域理解成變量生效的位置便可,作用域

但賦值會保留在原位置,這也就造成第一行輸出的結果,js真實的過程是將第二行提早到了第一行以前,當js執行到第一行時,開發

因爲var a被提早了,但並未賦初始值,因此輸出了undefined,到這裏你們應該理解了什麼是聲明提早io

聲明提早破壞了程序的執行順序,因此你們知道原理便可,切勿在實際開發過程當中使用,不只會下降代碼可讀性,還容易形成程序錯誤console

function a(){
    console.log(10);  
}
a();                                       //20
function a(){
    console.log(20);      
}
a();                                       //20

如上圖所示,本意是想調用這個函數輸出10和20,但因爲聲明提早,後一個a函數將第一個a函數覆蓋,10永遠沒法輸出,function

這在生產環境中是很容易產生的,兩我的一塊兒工做,你聲明一個函數或變量,而另外一我的也聲明瞭一個跟你相同的函數或變量,

致使出現的bug很是難以發現和修改,因此在ES6的規定中,建議用let關鍵字來代替var,採用匿名函數自調(一種解決js全局做用域弊病的方法)的方式

來解決聲明提早的問題

 

好啦,若有錯誤請多指正

相關文章
相關標籤/搜索