阮一峰的ES6---let和const命令

local0發表於2021-09-09

一,let和const命令
let命令用來宣告變數,他的作用類似於var,但是所宣告的變數只在let命令所在的程式碼塊內部有效,不像var那樣,會發生變數提升現象;
for()迴圈的計數器,適合使用let命令;

for(let i =0;i

暫時性的死區

var name="MGT360124";
if(true){
name = "YSS360124";//ReferenceError
let name;
}

全域性變數name,但是塊級作用域內有let又宣告瞭一個區域性變數name;
導致後者繫結這個塊級作用域,所以在let宣告變數前,對name賦值會報錯;所以在程式碼塊內,使用let命令宣告變數之前,該變數都是不可用的,在語法上稱為"暫時性死區"(TDZ);
‘’暫時性的死區‘’也意味著typeof不再是一個百分之百安全的操作;

{
typeof name;//ReferenceError
let name;
}

ES5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。
第一種場景,內層變數可能會覆蓋外層變數。

var name = "MGT360124";
function getName(){
console.log(name);
var name="YSS360124"
}
getName();//undefined

第二種場景,用來計數的迴圈變數洩露為全域性變數。

for(var i=0;i

ES6的塊級作用域

{
let name = "MGT360124";
}
name;

ES6 允許塊級作用域的任意巢狀。

{{{{
  {let insane = 'Hello World'}
  console.log(insane); // 報錯
}}}};

do表示式
塊級作用域是一個語句,將多個操作封裝在一起,沒有返回值。
使用do表示式,使得塊級作用域可以變為表示式,也就是說可以返回值;

let x = do{
 let t = f();
  t * t + 1;
}//變數x會得到整個塊級作用域的返回值

const 命令
const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。

const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.

const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。const foo; // SyntaxError: Missing initializer in const declaration
const的作用域與let命令相同:只在宣告所在的塊級作用域內有效。const命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。
const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址不得改動,對於簡單資料型別(數值,字串,布林值),值就儲存在變數指向的那個記憶體地址,因此等同於常量,但是對於複合型別的資料(物件和陣列)變數指向的記憶體地址,儲存的只是一個指標,const只能保證這個指標第固定的,至於他指向的資料結構是不是可變的,就完全不能控制了;

const foo = {};
foo.prop=123;//為foo新增一個屬性
foo.prop;//123
foo={}//將foo指向另一個物件,就會報錯

常量foo儲存的是一個地址,這個地址指向一個物件,不可變的只是這個地址,
即不能把foo指向另一個地址,但是物件本身是可變的,所以依然可以為其新增新屬性;

const a = [];
a.push("hello");
a.length = 0;
a=["world"];//報錯

頂層物件的屬性
頂層物件,在瀏覽器環境指的是window物件,在node指的是global物件;
頂層物件的屬性和全域性變數掛鉤,被認為是js中最大的失敗;ES6為了改變這一點,並保持相容性,var 命令和function命令宣告的全域性變數,依舊是頂層物件,另一方面規定:let命令和const命令,class命令宣告的全域性變數不再屬於頂層物件的屬性,也就是說:從ES6開始,全域性變數將逐漸與鼎城物件的屬性脫鉤;

var name="MGT360124";
window.name;//MGT360124

let age=18;
window.age;//undefined

ES5的頂層物件,本身也是個問題,因為他在各種實現裡面是不統一的;
1,瀏覽器裡面,頂層物件是window,但是node和web workers(Web Workers 是 HTML5 提供的一個javascript多執行緒解決方案)沒有window
2,瀏覽器和web Workers裡面,self也是指向頂層物件,但是node沒有self
3,node裡面頂層物件時global,但是其他環境都不支援;
同一段程式碼為了能夠在各種環境,都能取得到頂層物件,一般用this變數,但是也有侷限性。
1, 全域性環境中,this會返回頂層物件。但是node模組和ES6模組中this
返回的是當前模組;
2,函式里面的this,如果函式不是作為物件的方法執行,而是單純作為函式執行,那麼this會指向頂層物件,但是在嚴格模式下,this會返回undefined;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/132/viewspace-2799500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章