ECMAScript 6 -- let和const命令
ES6新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
for (let i = 0; i < 10; i++) {console.log(i);}
可以执行
for (let i = 0; i < 10; i++) {} console.log(i);
就会报错
ncaught ReferenceError: i is not defined at <anonymous>:3:13 at Object.InjectedScript._evaluateOn (<anonymous>:145:167) at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25) at Object.InjectedScript.evaluate (<anonymous>:118:14)
let var使用区别:
var:
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6]();
结果:
10
变量i
是var
声明的,在全局范围内都有效,所以全局只有一个变量i
。每一次循环,变量i
的值都会发生改变,而循环内被赋给数组a
的function
在运行时,会通过闭包读到这同一个变量i
,导致最后输出的是最后一轮的i
的值,也就是10。
let:
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6]();
结果:
6
变量i
是let
声明的,当前的i
只在本轮循环有效,所以每一次循环的i
其实都是一个新的变量,所以最后输出的是6。
for
循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
不存在变量升级:
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
VM171:2 undefined
报错:
VM171:6 Uncaught ReferenceError: bar is not defined
at <anonymous>:6:13
at Object.InjectedScript._evaluateOn (<anonymous>:145:167)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25)
at Object.InjectedScript.evaluate (<anonymous>:118:14)(anonymous function) @ VM171:6InjectedScript._evaluateOn @ VM68:145InjectedScript._evaluateAndWrap @ VM68:137InjectedScript.evaluate @ VM68:118