一:var是函式作用域,let,const是塊作用域,
例子1:
{
let a = 10;
var b = 1;
}
區別:
a會報找不到
b=1
上面代碼在代碼塊之中,分別用let和var宣告了兩個變數,然后在代碼塊之外呼叫這兩個變數,結果let宣告的變數報錯,var宣告的變數回傳了正確的值,這表明,let宣告的變數只在它所在的代碼塊有效,
例子2:
var arr=[1,3,4,5]
for(let i=0;i<arr.length;i++){}
console.log(i) //報找不到 上面代碼的計數器i,只在for回圈體內有效,(區塊內)
for(var i=0;i<arr.length;i++){}
console.log(i) //結果4```
注:for回圈內最好還是使用let 使用var的話沒有停留狀態
停留狀態補充代碼:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
二:let,const不存在變數提升
例子:
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}
function do_something() {
console.log(foo); // 2
var foo = 2;
}
原因:暫時性死區
只要塊級作用域記憶體在let命令,它所宣告的變數就“系結”(binding)這個區域,不再受外部的影響,
ES6明確規定,如果區塊中存在let和const命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域,凡是在宣告之前就使用這些命令,就會報錯,
總之,在代碼塊內,使用let命令宣告變數之前,該變數都是不可用的,這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱TDZ),
三:let const 不能重復定義
例子1:
// 報錯
function () {
let a = 10;
var a = 1;
}
// 報錯
function () {
let a = 10;
let a = 1;
}
原因:let不允許在相同作用域內,重復宣告同一個變數,
例子2:
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
function f2() {
var n = 5;
if (true) {
var n = 10;
}
console.log(n); // 10
}
區別:上面的函式有兩個代碼塊,let宣告了變數n,運行后輸出5,這表示外層代碼塊不受內層代碼塊的影響,如果使用var定義變數n,最后輸出的值就是10,
const的補充說明:
注:const也用來宣告變數,但是宣告的是常量,一旦宣告,常量的值就不能改變,下面代碼表明改變常量的值是不起作用的,需要注意的是,對常量重新賦值不會報錯,只會默默地失敗,
const PI = 3.1415;
PI // 3.1415
PI = 3;
PI // 3.1415
const PI = 3.1;
PI // 3.1415
注:由于const命令只是指向變數所在的地址,所以將一個物件宣告為常量必須非常小心
const foo = {};
foo.prop = 123;
foo.prop
// 123
foo = {} // 不起作用
上面代碼中,常量foo儲存的是一個地址,這個地址指向一個物件,不可變的只是這個地址,即不能把foo指向另一個地址,但物件本身是可變的,所以依然可以為其添加新屬性,
下面是另一個例子,
const a = [];
a.push("Hello"); // 可執行
a.length = 0; // 可執行
a = ["Dave"]; // 報錯
上面代碼中,常量a是一個陣列,這個陣列本身是可寫的,但是如果將另一個陣列賦值給a,就會報錯,
如果真的想將物件凍結,應該使用Object.freeze方法,
const foo = Object.freeze({});
foo.prop = 123; // 不起作用
上面代碼中,常量foo指向一個凍結的物件,所以添加新屬性不起作用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/271431.html
標籤:區塊鏈
下一篇:精彩回顧丨CyberVein全球大使Jack做客幣世界直播間,進行《Heco重構想象,講述NFT中場故事》&CROSS主題分享
