1. 程式人生 > >ECMAScript中var、let、const的區別

ECMAScript中var、let、const的區別

1.let和var的區別
    (1)var會存在變數提升的現象,let所宣告的變數一定要在聲明後使用,否則報錯。

    (2)let宣告的變數只在它所在的程式碼塊有效。var可以在程式碼塊外進行呼叫。

程式碼如下:

{
	var c = 1;
	let g = 2;
	console.log(g);//返回2
}
	console.log(c);//返回1
	console.log(b);//報錯
	var b = 1;
	let a = 3;
	console.log(a);//返回3
//塊級作用域
	var dates = new Date();

	function f() {
		console.log(dates);
		if(false) {
			var dates = "hello";

		}
	}
	console.log(f()); //報錯

	function f1() {
		let n = 5;
		if(true) {
			let n = 10;
		}
		console.log(n); // 5
	}

(3)for迴圈存在父子作用域

for迴圈計數器:

程式碼中,變數i是let宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是一個新的變數,所以最後輸出的是6。你可能會問,如果每一輪迴圈的變數i都是重新宣告的,那它怎麼知道上一輪迴圈的值,
從而計算出本輪迴圈的值?這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。
另外,for迴圈還有一個特別之處,就是設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。


	var arr = [];
	for(let i = 0; i < 10; i++) {
		arr[i] = function() {
			console.log(i)//返回6
		}
	}
	arr[6]();

程式碼中,變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同一個i,導致執行時輸出的是最後一輪的i的值,也就是 10。如果使用let,宣告的變數僅在塊級作用域內有效,最後輸出的是 6。

var ar = [];
	for(var i = 0; i < 10; i++) {
		ar[i] = function() {
			console.log(i);//輸出10
		}
	}
	ar[1]();

2.const用來定義常量,使用時必須初始化(即必須賦值),只能在塊作用域裡訪問,而且不能修改。