1. 程式人生 > >js中const,let,var的區別及作用域

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宣告變數吧~