在es5中,宣告變數只有var和function兩種形式。但是因為var宣告的變數會有一定的缺點(內層變數可能覆蓋外層變數的問題以及用來計數的迴圈變數洩露為全域性變數,下面會有詳細的介紹),es6提出了使用let和const宣告變數,下面就來看看他們之間的區別。
1,什麼時候提出的?
var是es5提出的,let和const是es6提出的。2,是否存在變數提公升?
var宣告的變數存在變數提公升(將變數提公升到當前作用域的頂部)。即變數可以在宣告之前呼叫,值為undefined。let和const不存在變數提公升。即它們所宣告的變數一定要在宣告後使用,否則報referenceerror錯。
console.
log(f)
//undefined
var f =1;
console.
log(g)
//referenceerror: g is not defined
let g =2;
console.
log(h)
//referenceerror: g is not defined
const h =
2;
3,是否存在暫時性死區?
let和const存在暫時性死區。即只要塊級作用域內存在let命令,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響。
var tmp =
123;if(
true
)//以上**if後面{}形成了塊級作用域,由於使用let宣告了tmp,則這個變數就繫結了塊區域,在宣告之前使用,會報錯。
在**塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 tdz)。
總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
4,是否允許重複宣告變數?
var允許重複宣告變數。let和const在同一作用域不允許重複宣告變數。
var f =4;
var f =5;
console.
log(5)
//5let g =6;
let g =7;
console.
log(7)
//syntaxerror: identifier 'g' has already been declared
const h =8;
const h =9;
console.
log(h)
//syntaxerror: identifier 'g' has already been declared
5,是否存在塊級作用域?
var不存在塊級作用域。let和const存在塊級作用域。到底什麼叫塊級作用域呢,
es5中作用域有:全域性作用域、函式作用域。沒有塊作用域的概念。因此也有一系列的問題。
//1,內層變數可能覆蓋外層變數的問題
var a =2;
function
fun()}
fun(
)//2,用來計數的迴圈變數洩露為全域性變數。
var s =
'hello'
;for
(var i =
0; i < s.length; i++
)console.
log(i)
;// 5 i迴圈結束後,洩露成了全域性變數
ecmascript 6(簡稱es6)中新增了塊級作用域。塊作用域由 包括,if語句和for語句裡面的也屬於塊作用域。
//1,解決內層變數可能覆蓋外層變數的問題
var b =2;
function
fun1()
}fun1()
//2,解決用來計數的迴圈變數洩露為全域性變數。
var s1 =
'hello'
;for
(let j =
0; j < s1.length; j++
)console.
log(j)
;// 報錯 j is not defined
6,是否能修改宣告的變數?
var和let可以。
const宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
const f =10;
// f= 11;
// console.log(f) //報錯 不能進行重複宣告
const obj =
obj.age =
20console.
log(obj)
//
//const宣告常量,不允許對變數重新賦值。對於引用型別的值而言,只要在棧記憶體儲存的位址值不變即可。
注:本文參考了阮一峰的es6 let,const,var定義變數的區別?
一,作用域 const和let 沒有變數提公升,且定義的變數只在let命令所在的 塊生效,在定義之前使用,會報錯 var 變數會被提公升,在全域性範圍內都有效,且可在變數定義之前使用 二 重複宣告 const和let 在同一作用域內,不允許重複宣告同乙個變數 var 允許重複宣告 三 賦值 let ...
ES6新增 let const var的區別
var定義的變數,沒有塊的概念,可以跨塊訪問,不能跨函式訪問。let定義的變數,只能在塊作用域裡訪問,不能跨塊訪問,也不能跨函式訪問。const用來定義常量,使用時必須初始化 即必須賦值 只能在塊作用域裡訪問,而且不能修改。es6的let變數宣告特點 1.擁有塊級作用域 2.沒有變數宣告提公升 3....
ES6的宣告 let,const,var區別
a 報錯 referenceerror a is not definedlet 是在 塊內有效,var 是在全域性範圍內有效 a referenceerror a is not defined b 1let a 1 let a 2 var b 3 var b 4 a identifier a has...