踩着前人的肩膀,努力前行。參考了不少前人的文章。es6
es6以前聲明變量只能用var,var的特色是不管聲明在何處,都會被視爲聲明在函數的最頂部(不在函數內即在全局做用域的最頂部)安全
function test(){ if(false){ var name = "zhangsan"; }else{ console.log(name); //此處訪問值爲undefined } console.log(name); //此處訪問值爲undefined }
能夠看到雖然打印結果是undefined,可是並無報錯。那是由於被js編譯過結果就變成了函數
function test(){ var name; //這就是js的變量提高 if(false){ name = "zhangsan"; }else{ console.log(name); //此處訪問值爲undefined } console.log(name); //此處訪問值爲undefined }
再來看ES6新增的let,const。它們的做用域只在一個函數內部或者一個代碼塊內部。code
function test() { if(flag) { let name = 'zhangsan' } else { //此處訪問會直接報錯。訪問不到。 console.log(test) } }
const做用域和let同樣。可是他一般被用於定義常量。就是它的值被設置完成後就不能再修改了。對象
const name = 'lux' name = 'joe' // 再次賦值此時會報錯
可是,若是 const 的是一個對象,對象所包含的值是能夠被修改的。抽象一點兒說,就是對象所指向的地址不能改變,而變量成員是能夠修改的。作用域
const student = { name: 'cc' } // 能夠成功 student.name = 'yy'; // 若是這樣子就會報錯了 student = { name: 'yy' };
還有TDZ(暫時性死區)get
{ console.log(value) // 報錯 let value = 'lala' }
咱們都知道,JS引擎掃描代碼時,若是發現變量聲明,用 var 聲明變量時會將聲明提高到函數或全局做用域的頂部。可是 let 或者 const,會將聲明關進一個小黑屋也是TDZ(暫時性死區),只有執行到變量聲明這句語句時,變量纔會從小黑屋被放出來,才能安全使用這個變量。io
本文基本是參考https://www.jianshu.com/p/287...。原文說的更仔細,有更多的內容。console