前言
- ES6中引入了let關鍵字和塊級作用域的概念,該博文從多方面說明let和var關鍵字的區別,以及ES6引進該關鍵字的“The Good Parts”,以及解決的一些javascript之前存在的問題,
let和var的相同點
- let和var關鍵字都用于宣告變數
let和var的不同點
變數作用域
- let關鍵字宣告的變數只在let命令所在的代碼塊內有效,
var x = 2;
let y = 3;
- 上面代碼中,var和let的作用域都是全域作用域,但是要注意:
- 在javaScript中,全域作用域是針對JavaScript環境
- 在HTML中,全域作用域是window物件
- 使用var關鍵字宣告的全域作用域變數屬于window物件
- 使用 let 關鍵字宣告的全域作用域變數不屬于 window 物件
let name = 'Aaron_hj';
//不能使用window.name訪問該變數
回圈作用域
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
上面的代碼中,i是由var命令宣告的,在全域范圍內都有效,所以全域中只有一個i變數,每一次回圈后,i的值都會發生變化,而回圈內被賦給陣列a的函式內部的console.log(i),里面的i指向的就是全域中的i,也就是說,陣列a中每一項的i指向的都是同一個i,也就是完全回圈后的i的值,也就是10;(The Bad One)
- 但如果使用let宣告i,就可以解決這個問題
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
上面的代碼中,i是由let宣告的,只在for{}里有效,每次回圈,都會重新創建一個i變數,所以回圈內賦給陣列a函式內的console.log(i),里面的i都是重新宣告的,那么這里有一個問題:它怎么知道上一輪回圈的值,從而計算出本輪回圈的值?這是因為js引擎內部會記住上一輪回圈的值,初始化本輪的變數i時,就在上一輪回圈的基礎上進行計算的,
注:for回圈的一個特殊之處在于:設定回圈變數的那部分是一個父作用域,而回圈體內部是一個單獨的子作用域,
重置變數
- let不允許在相同作用域內,重復宣告同一個變數
- var可以
var x = 2;
let x = 3;//報錯
let y = 4;
let y = 5;//報錯
let z = 6;
let z = 7;//報錯
這里不知大家會不會思考一個問題,在使用var關鍵字重新宣告變數可能會帶來問題,在塊內重新宣告變數也會重新宣告快外的變數(The Bad There)
var x = 10;
// 這里輸出 x 為 10
{
var x = 2;
// 這里輸出 x 為 2
}
// 這里輸出 x 為 2
let關鍵字就可以解決該問題,因為它只在let命令在的代碼塊{}生效
var x = 10;
// 這里輸出 x 為 10
{
let x = 2;
// 這里輸出 x 為 2
}
// 這里輸出 x 為 10
變數提升
- var命令會發生變數提升的現象,即變數可以在宣告前使用,值為undefined,(The Bad Two),按一般邏輯,變數應該在宣告陳述句后才可以使用,
- let關鍵字的宣告就糾正了該現象,它所宣告的變數一定要在宣告后使用,否則拋出錯誤,
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
暫時性死區
Es6中明確規定,如果區塊記憶體在let和const命令,這個區塊對這些區塊對這些命令的變數,從一開始就形成了封閉作用域,不再受外部的影響,而只要是宣告前,都是let的死區,這在語法上,稱為“暫時性死區”
if (true) {
// TDZ開始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ結束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
上面代碼中,let宣告變數tmp之前,都屬于tmp的“死區”,注:“暫時性死區”意味著typeof不再是百分百安全的操作,因為let宣告前,都是tmp的“死區”
typeof tmp; //ReferenceError
let tmp;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/278139.html
標籤:區塊鏈
下一篇:CHIA使用礦池教程
