前言
踩著前人的肩膀,努力前行。參考了很多前人的文章。
1.變量聲明const和let
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。它們的作用域只在一個函數內部或者一個代碼塊內部。
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(暫時性死區)
{console.log(value) // 報錯let value = 'lala'
}
我們都知道,JS引擎掃描代碼時,如果發現變量聲明,用 var 聲明變量時會將聲明提升到函數或全局作用域的頂部。但是 let 或者 const,會將聲明關進一個小黑屋也是TDZ(暫時性死區),只有執行到變量聲明這句語句時,變量才會從小黑屋被放出來,才能安全使用這個變量。
2.未完待續
本文基本是參考https://www.jianshu.com/p/287...。原文說的更仔細,有更多的內容。