聲明提早這個概念對於前端攻城獅來講是一個很瞭解的了,可是對於初入前端的新人來講,這又是一個不得不談的話題前端
下面我將介紹一下什麼是聲明提早函數
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全局做用域弊病的方法)的方式
來解決聲明提早的問題
好啦,若有錯誤請多指正