ES6新增了let命令 ,它是一個塊級域的局部變量,而且能夠給它一個初始化值。let容許把變量的做用域限制在塊級域中。與 var 不一樣處是:var申明變量要麼是全局的,要麼是函數級的,而沒法是塊級的。let聲明的變量做用域包含定義它的塊以及任何包含的子塊中。在這方面,let與var很是像。它們之間主要的區別在於一個var變量的做用域是整個封閉函數。javascript
{ 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
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。
console.log(foo); //undefined console.log(bar); //not defined var foo = 2; let bar = 2;
//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
//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; // 不報錯 } }
let語句塊爲變量提供了局部做用域。它的做用是在單一代碼塊的詞法範圍內綁定零個或多個變量; 此外與普通語句塊沒有任何區別。須要特別注意的是, 在let語句塊內使用 var 聲明的變量,它的做用域與在let語句塊以外聲明沒有區別;這樣的變量仍然具備函數做用域。在使用let語句塊時,必須使用花括號,不然會致使語法錯誤。es6
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函數