ECMAScript 6 let 命令介紹

1、使用 let 命令來聲明變量的總結

ES6新增了let命令 ,它是一個塊級域的局部變量,而且能夠給它一個初始化值。let容許把變量的做用域限制在塊級域中。與 var 不一樣處是:var申明變量要麼是全局的,要麼是函數級的,而沒法是塊級的。let聲明的變量做用域包含定義它的塊以及任何包含的子塊中。在這方面,letvar很是像。它們之間主要的區別在於一個var變量的做用域是整個封閉函數。javascript

  • 它的用法相似於var,可是所聲明的變量,只在let命令所在的代碼塊內有效。
  • let命令聲明的變量在循環體內的時候每次都是一個新的變量。
  • 不存在變量提高。
  • 暫時性死區(只要塊級做用域內存在let命令,它所聲明的變量就「綁定」(binding)這個區域,再也不受外部的影響。ES6明確規定,若是區塊中存在letconst命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。凡是在聲明以前就使用這些變量,就會報錯)。
  • 不容許重複聲明。

 2、let聲明的變量只在它所在的代碼塊有效

{
	let a = 10;
	var b = 1;
}
//console.log(b);		//1
//console.log(a);		//not defined
//for循環的計數器,就很合適使用let命令。
//計數器i只在for循環體內有效,在循環體外引用就會報錯。
for (let i = 0; i < 10; i++) {
	//console.log(i);
}
//console.log(i); //not defined

3、let命令聲明的變量在循環體內的時候每次都是一個新的變量

var a = [];

for (let j = 0; j < 10; j++) {
	a[j] = function(){
		return j;
	}
}

a[5]();		//5
a[4]();		//4
//上面代碼中,變量j是let聲明的,當前的j只在本輪循環有效,因此每一次循環的j其實都是一個新的變量,因此最後輸出的是j。

4、不存在變量提高

console.log(foo);	//undefined
console.log(bar);	//not defined
var foo = 2;
let bar = 2;

5、暫時性死區

//ES6明確規定,若是區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。
//凡是在聲明以前就使用這些變量,就會報錯。
//總之,在代碼塊內,使用let命令聲明變量以前,該變量都是不可用的。
var temp;
	
if( true ){
	temp = 'abc';		//temp is not defined(…)
	let temp;
}
var temp;
		
if( true ){
	//temp = 'abc';	        //not defined
	//console.log(temp);	//not defined
	
	let temp;
	console.log(temp);		//undefined
	temp =  3;		
	console.log(temp);		//3
}
//「暫時性死區」也意味着typeof再也不是一個百分之百安全的操做。
typeof x;		//not defined
let x;
//上面代碼中,undeclared_variable是一個不存在的變量名,結果返回「undefined」。
//因此,在沒有let以前,typeof運算符是百分之百安全的,永遠不會報錯。如今這一點不成立了。
//這樣的設計是爲了讓你們養成良好的編程習慣,變量必定要在聲明以後使用,不然就報錯。
console.log(typeof undeclared_variable);	//undefined

在 ECMAScript  2015中, let將會提高這個變量到語句塊的頂部。然而,在這個語句塊中,在變量聲明以前引用這個變量會致使一個ReferenceError。 由於let變量 在"暫存死區" (從塊的開始到聲明這段)。總之,暫時性死區的本質就是,只要一進入當前做用域,所要使用的變量就已經存在了,可是不可獲取,只有等到聲明變量的那一行代碼出現,才能夠獲取和使用該變量。java

6、不容許重複聲明

//Identifier 'a' has already been declared
(function (){
	let a = 10;
	var a = 1;
}());

//Identifier 'b' has already been declared
(function (){
	let b = 10;
	let b = 1;
}());
//所以,不能在函數內部從新聲明參數。
//Identifier 'arg' has already been declared
function func(arg) {
	let arg; // 報錯
}
switch (x) {
  case 0:
    let foo;
    break;
    
  case 1:
    let foo; // Identifier 'foo' has already been declared
    break;
}

 

//let後跟一個函數傳遞的參數時將致使循環內部報錯。
function go(n){
  for (let n of n.a) { // TypeError: n is not defined(…)
    console.log(n);
  }
}
go({a:[1,2,3]});
//函數內加入一個代碼塊就不會報錯
function func(arg) {
  {
    let arg; // 不報錯
  }
}

7、總結

let語句塊爲變量提供了局部做用域。它的做用是在單一代碼塊的詞法範圍內綁定零個或多個變量; 此外與普通語句塊沒有任何區別。須要特別注意的是, 在let語句塊內使用 var 聲明的變量,它的做用域與在let語句塊以外聲明沒有區別;這樣的變量仍然具備函數做用域。在使用let語句塊時,必須使用花括號,不然會致使語法錯誤。es6

8、參考連接

http://es6.ruanyifeng.com/#docs/let編程

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let安全

https://stackoverflow.com/questions/37916940/js-why-let-have-this-name函數

相關文章
相關標籤/搜索