let和const均爲ES6中聲明變量的方法,用法相似於var,可是其所聲明的變量,只在let命令所在的代碼塊內有效
<!-- more -->git
其所聲明的變量,必須先聲明再使用,若先使用,後聲明則會報錯github
即在存在let的塊級做用域,造成了一個封閉的環境,在這其中,若先使用後聲明則仍舊會報錯瀏覽器
以下:ide
{ console.log(temp);//暫時性死區,會報錯 let temp //死區結束 }
有些隱蔽的死區以下:函數
function foo(x=y,y=2){ return [x,y] } foo() //報錯
該報錯是由於在y尚未聲明的時候就使用了(將y賦值給x),此時就會報錯指針
在同一個做用域中,不能重複聲明同一個變量code
function a(){ let a = 5; var a = 5; } function b(){ let a = 5; let a = 5; }
這二者都會報錯對象
let和const實際上提供了一種塊級做用域
ES6容許塊級做用域隨意嵌套
外層做用域沒法讀取內層做用域的變量,內層做用域的變量可覆蓋外層做用域的變量ip
function f() { console.log('I am outside!'); } (function () { if (false) { // 重複聲明一次函數f function f() { console.log('I am inside!'); } } f(); }());
ES6中,理論上該函數運行會獲得I am outside
,由於外層的做用域沒法訪問內層變量,但內層做用域的變量可訪問外層變量.
在因爲兼容性問題,在瀏覽器中,塊級做用域聲明的函數,行爲相似於var聲明的變量內存
note:考慮到兼容性問題,應該避免在塊級做用域中聲明函數,或者聲明時利用函數表達式的形式聲明:
// 函數聲明語句 { let a = 'secret'; function f() { return a; } } // 函數表達式 { let a = 'secret'; let f = function () { return a; }; }
note: ES6 的塊級做用域容許聲明函數的規則,只在使用大括號的狀況下成立,若是沒有使用大括號,就會報錯
const聲明的變量即常量,即聲明後沒法改變該變量的值,因此const聲明變量時候必須進行初始化,若不聲明,則會報錯
const與let相似:只在聲明所在的塊級做用域內有效,不存在變量提高,一樣存在暫時性死區,只能在聲明的位置後邊使用
const的聲明變量的值不變是針對於變量指向的內存地址不變,
對於值類型的變量類型來講,則值不能變,
但對於引用類型的變量類型來講,則該變量所指向的內存地址不變,即指向對象的指針不變,但對象的內容是能夠變的,
const foo = {}; // 爲 foo 添加一個屬性,能夠成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另外一個對象,就會報錯 foo = {}; // TypeError: "foo" is read-only
const foo = {}; // 爲 foo 添加一個屬性,能夠成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另外一個對象,就會報錯 foo = {}; // TypeError: "foo" is read-only
ES6聲明變量的六種方法var function let const import class