js中const,let,var的區別及作用域
要說他們的區別,首先需要了解作用域的概念
作用域永遠都是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。首先理解兩個概念:塊級作用域與函式作用域。
1.塊級作用域
任何一對花括號 {} 中的語句集都屬於一個塊,在這之中定義的所有變數在程式碼塊外都是不可見的,我們稱之為塊級作用域。比如if(){} ,for(){}中的花括號都是塊級作用域
2.函式作用域
很明顯是function(){}的形式,定義在函式中的引數和變數在函式外部是不可見的
而三個變數中 var是忽視塊級作用域的,也就是說在塊級作用域中用var定義,在外部是可以訪問到變數值得,var只有在函式作用域中宣告外部才不能訪問。而且var宣告的變數會被宣告提前,被提升到作用域頂部,並被賦值為undefinded
const和let是有塊級作用域概念的,也就是說在塊級作用域中用const或者let定義,外部無法訪問變數!且不可以宣告提前
具體的區別和案例我在下面列舉
1.const
const就是一個定義的常量,在宣告的時候就必須要賦值,且這個值不能再被改變,否則會報錯。
重點:
1)當宣告時不賦值報錯
const a;
2) 當試圖改變const常量時報錯
const a=1;
a=2;
3)在同一作用域中重複定義報錯
const a=1;
const a=2;
4)不會被宣告提前(與var有區別)
console.log(a) const a=2;
5)可以宣告塊級作用域的變數,塊級作用域外無法訪問內部變數!
if(true){
const a=1;
}
console.log(a)
2.let
let和var比較相似,區別就是let不能被宣告提前且可以宣告塊級作用域的變數,還有就是不能被重複宣告
1)可以宣告時不賦值
let a;
a=1;
console.log(a)
2)在同一作用域中不可以重複定義
let a;
let a=1;
console.log(a)
或
let a=1;
var a=1;
console.log(a)
都報錯
3)不會被宣告提前(與var有區別)
console.log(a)
let a=1;
4)可以宣告塊級作用域的變數,塊級作用域外無法訪問內部變數!
if(true){
let a=1;
}
console.log(a)
for(let a=0;a<10;a++){
}
console.log(a)
let a=1;
if(true){
let a=2;
}
console.log(a) //1
3.var
var我們最熟悉了,就是宣告變數用的,但它不能定義塊級作用域變數,且會被宣告提前
1)可重複定義
var a=1;
var a=2;
console.log(a) //2
2) 宣告時可以不賦值
var a;
console.log(a) //undefined
3)js程式在正式執行之前,會將所有var 宣告的變數和function宣告的函式,預讀到所在作用域的頂部,但是對var 宣告只是將宣告提前,賦值仍然保留在原位置
console.log(a) //undefined
var a=10;
console.log(a) //10
相當於變成了這樣
var a;
console.log(a) //undefined
a=10;
console.log(a) //10
4)無法定義塊級作用域變數,在塊級作用域中定義相當於定義了一個全域性變數
for(var a=0;a<10;a++){
}
console.log(a) //10
console.log(a) //undefined
if(true){
var a=1;
}
console.log(a) //1
小結:建議多使用let,畢竟for中的i一般不想被洩露出來,而且if中定義的變數一般只想在條件成立時才定義,實現這些都需要用let,而且let沒有變數被宣告提前的困擾,其他兩者沒有太大區別,所以還是改成用let宣告變數吧~