ES6新增命令:let

let的介紹

let是ES6新增的命令。 做用:聲明變量。 相似於:var。 與var的區別:使用let聲明的變量,只在其所在的代碼塊內有效。javascript

定義回顧

聲明變量:能夠用var,也能夠不用var。 是否容許變量提高:容許。 是否容許重複聲明同一個變量:容許。 變量的做用域:全局做用域、函數做用域。 在全局做用域中,不管是否使用var,定義的變量都是全局變量。 在函數做用域中,使用var定義函數局部變量,不使用var定義全局變量。 全局變量全局可用,函數局部變量在函數內可用。 代碼塊:用{}栝起來的代碼片斷。java

基本語法

let聲明的變量,只在其所在其所在的代碼塊內有效。 let不存在變量提高。 let不容許重複聲明。 let不容許在函數的一級做用域內從新聲明參數。 let存在的塊級做用域,它聲明的這個變量或「綁定」這個區域,造成「暫時性死區」,使其再也不受外部影響。 就是說,一個變量,不管其在外部是否聲明,只要在某個塊級做用域內使用let從新聲明瞭,那麼在這個塊級做用域內該變量在聲明前是不能夠使用的。bash

使用場景

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>
複製代碼
相關文章
相關標籤/搜索