在es5中,宣告變數只有var
和function
兩種形式。但是因為var宣告的變數會有一定的缺點(內層變數可能覆蓋外層變數的問題以及用來計數的迴圈變數洩露為全域性變數),es6提出了使用let和const宣告變數。
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;
let和const存在暫時性死區。即只要塊級作用域內存在let命令,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響。
var tmp =
123;if(
true
)//以上**if後面{}形成了塊級作用域,由於使用let宣告了tmp,則這個變數就繫結了塊區域,在宣告之前使用,會報錯。
在**塊內,使用let命令宣告變數之前,該變數都是不可用的。
這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 tdz)。
總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
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
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
var
和let
可以修改
const
宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
const f =10;
// f= 11;
// console.log(f) //報錯 不能進行重複宣告
const obj =
obj.age =
20console.
log(obj)
//
//const宣告常量,不允許對變數重新賦值。對於引用型別的值而言,只要在棧記憶體儲存的位址值不變即可。
js中var let const的區別
主要內容是 js中三種定義變數的方式const,var,let的區別。var定義的變數可以修改,如果不初始化會輸出undefined,不會報錯。var a 1 var a 不會報錯 console.log 函式外var定義a a 可以輸出a 1 function change change cons...
JS中var let const的區別
作用域 全域性或區域性 var的作用域可以是全域性或是區域性,以下分四種情況說明 1 當var關鍵字宣告於函式內時是區域性變數,此時在函式外訪問會報錯。2 當var關鍵字宣告於函式外時是全域性變數,此時不論在函式外部還是內部都可以訪問到。3 當var關鍵字第一次宣告變數於函式外時是全域性變數,並且在...
JS中,var,let,const的區別
1 var var 定義的變數可以修改,如果不初始化,輸出為undefined,不會報錯。var a 輸出為undefined function num num console.log 寫在fun外的輸出 a 輸出為22 let let 定義的變數可修改,是塊級作用域,函式內部定義了let後,對函式...