ES6 var let const 的區別
var
?1. 只支持全域作用域和函式作用域
{
var m = 2
}
console.log(m)//輸出為2
?2. 不支持塊級作用域
?3. 會自動提升宣告
console.log(m)//輸出undefined
var m = 2
?此處不會報錯,因為用var宣告的變數會提升宣告(只提升宣告)到整個作用域的開頭,相當于以下代碼:
var m
console.log(m)//輸出undefined
m = 2
?4. 可重復宣告變數
var m = 2
var m = 5
?此處不會報錯,var允許重復宣告變數,但它的含義是重新開辟記憶體空間再賦值,而并非覆寫原有的變數值
let
? 1.還支持塊級作用域
{
let m = 2
}
console.log(m)//報錯
?此處報錯的原因是let具有塊級作用域(即一對{ }之間)
? 2.不提升宣告
{
console.log(m)//報錯
let m = 5
}
?let宣告的變數智能先宣告后使用
? 3.不可重復宣告
{
let m = 2
let m = 3
console.log(m)//報錯
}
? 4.TDZ( 暫時性死區 )
? 只要塊級作用域記憶體在 let 命令,它所宣告的變數就“系結”( binding )這個區域,不再受外部的影響,
?ES6 明確規定,如果區塊中存在 let命令,則這個區塊對這些命令宣告的變數
開始就形成封閉作用域,只要在宣告之前就使用這些變數 就會報錯,
var tmp = 123;
{
tmp = 'abc '; //ReferenceError
let tmp ;
}
const
? 1.還支持塊級作用域 (同 let )
? 2.不提升宣告 (同 let )
? 3.不可重復宣告 (同 let )
? 4.TDZ (同 let )
? 5.宣告常量
{
const a = 2
a = 3//TypeError: Assignment to constant variable.
}
?const宣告一個只讀的常量,其余與let用法一致,
?當常量保存的不是原始值而是一個地址參考時,物件的屬性可改變,但不能更改它的參考
{
const obj = {
name:'Ann',
age:18
}
obj.age = 20//不會報錯
console.log(obj.age)//輸出20
obj = {x:0,y:0}//TypeError: Assignment to constant variable.
}

============================舉個栗子
?1.
{
var count = 10
let count = 20
console.log(count)//報錯**SyntaxError: Identifier 'count' has already been declared
}
?2.
{
var count = 10
if(count>0){
let count = 40
}
console.log(count)//10
}
?3.
{
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6]();//10
}
?let---->塊作用域,函式本身有閉包的行為,會將該變數的作用域保存
{
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6]();//6
}
?for形成外層作用域,回圈內部為子作用域,兩層作用域,使用就近的變數
{
for (let i = 0; i < 3; i++) {
let i = 'abc'
console.log(i)//輸出三次 abc
}
}
=========================首次創作,非常激動·····(ˊ????? ? ?????ˋ)~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/274791.html
標籤:區塊鏈
上一篇:《區塊鏈 基礎知識25講》筆記
下一篇:C++--queue的模擬實作
