ES6新增命令:let

陳田田發表於2018-12-21

let的介紹

let是ES6新增的命令。 作用:宣告變數。 類似於:var。 與var的區別:使用let宣告的變數,只在其所在的程式碼塊內有效。

定義回顧

宣告變數:可以用var,也可以不用var。 是否允許變數提升:允許。 是否允許重複宣告同一個變數:允許。 變數的作用域:全域性作用域、函式作用域。 在全域性作用域中,無論是否使用var,定義的變數都是全域性變數。 在函式作用域中,使用var定義函式區域性變數,不使用var定義全域性變數。 全域性變數全域性可用,函式區域性變數在函式內可用。 程式碼塊:用{}栝起來的程式碼片段。

基本語法

let宣告的變數,只在其所在其所在的程式碼塊內有效。 let不存在變數提升。 let不允許重複宣告。 let不允許在函式的一級作用域內重新宣告引數。 let存在的塊級作用域,它宣告的這個變數或“繫結”這個區域,形成“暫時性死區”,使其不再受外部影響。 就是說,一個變數,無論其在外部是否宣告,只要在某個塊級作用域內使用let重新宣告瞭,那麼在這個塊級作用域內該變數在宣告前是不可以使用的。

使用場景

for迴圈的計數器 let宣告的迴圈變數i只在本輪迴圈有效,每一次迴圈的i都是一個新變數。特別的JavaScript引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,是在上一輪迴圈的基礎上進行計算。 另外,for迴圈設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的自作用域。

程式碼片段

part 1:var宣告變數回顧

<script type="text/javascript">
	var a = 1;
	console.log(a);  // 1
	b = 2;
	console.log(b);  // 2
	console.log(c);  //undefined
	var c = 3;
	var a = 4;
	function showA(){
		console.log(a);
		d = 5;
		console.log(d);
	}
	showA();  // 4,5
	console.log(d);  //5
	function showB(){
		console.log(b);
		var e = 6;
		console.log(e);
	}
	showB();  //2,6
	console.log(e);  //報錯
</script>
複製程式碼

part 2:let宣告的變數時區域性變數

<script type="text/javascript">
	{
		var a = 1;
		let b = 2;
	}
	console.log(a);  //1
	console.log(b);  //報錯
</script>
複製程式碼

part 3:for迴圈中使用var定義迴圈引數,該引數會變味全域性引數

<script type="text/javascript">
	var a = [];
	for(var i = 0; i < 10; i++){
		a[i] = function(){
			console.log(i);
		}
	}
	a[6]();  //10
</script>
複製程式碼

part 4:for迴圈中使用let定義迴圈引數,改引數是塊級作用域內的引數

<script type="text/javascript">
	for(let i = 0; i < 10; i++){

	}
	console.log(i);  //報錯
</script>
複製程式碼

part 5:對比part3,用var定義迴圈變數

<script type="text/javascript">
	var a = [];
	for(let i = 0; i < 10; i++){
		a[i] = function(){
			console.log(i);
		}
	}
	a[6]();  // 6
</script>
複製程式碼

part 6:for迴圈中,外層是一個父作用域,裡面的每層迴圈是一個自作用域,互不影響

<script type="text/javascript">
	for(let i = 0; i < 3; i++){
		let i = 'abc';
		console.log(i);  //abc,abc,abc
	}
</script>
複製程式碼

part 7:let宣告的變數不允許變數提升

<script type="text/javascript">
	console.log(a);  //報錯
	let a = 1;
</script>
複製程式碼

part 8:塊級作用域中用let宣告的變數會形成【暫時性死區】,即使在全域性宣告瞭該變數,也不能在let宣告前呼叫

<script type="text/javascript">
	let a = 1;
	console.log(a);  //1
	{
		a = 2;
		let a;
		console.log(a);  // 報錯
	}
</script>
複製程式碼

part 9:let宣告的變數不允許重複宣告

<script type="text/javascript">
	let a = 1;
	console.log(a);  // 1
	let a = 2;
	console.log(a);  //報錯
</script>
複製程式碼

part 10:不允許在函式的一級作用域內使用let重新宣告引數

<script type="text/javascript">
	function showName(name){
		let name = 'sunny';
		console.log(name);
	}
	showName('lily');   // 報錯
</script>
複製程式碼

part 11:可以在函式的二級或三級等作用域內使用let重新宣告引數,且與一級作用域中的引數互不影響

<script type="text/javascript">
	function showName(name){
		console.log(name);
		{
			let name = 'sunny';
			console.log(name);
		}
	}
	showName('lily');   //lily,sunny
</script>
複製程式碼

相關文章