es6语法
一、 let
1、es6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
<script> { var a = 10; var a = 20; } console.log(a); // 20 { let b = 10; console.log(b) // 10 } console.log(b) // Uncaught ReferenceError: b is not defined </script>
上面代码在代码块之中,分别用let
和var
声明了两个变量。然后在代码块之外调用这两个变量,结果let
声明的变量报错,var
声明的变量返回了正确的值。这表明,let
声明的变量只在它所在的代码块有效
var a = []; for(var i = 0; i < 10; i++){ a[i] = function () { console.log(i); }; } a[5]() // 10
// ******************************
var b = []; for(let i = 0; i < 10; i++){ b[i] = function () { console.log(i); }; } b[5]() // 5
2、不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
function func() { let a = 10; var a = 1; return a; } console.log(func()); // Uncaught SyntaxError: Identifier 'a' has already been declared
// ******************************
function func() { let a = 10; let a = 1; return a; } console.log(func()); // Uncaught SyntaxError: Identifier 'a' has already been declared
function func(arg) { let arg; // 报错 } function func(arg) { { let arg; // 不报错 } }
3、为什么需要块级作用域
3.1、内层变量可能会覆盖外层变量
var a = 10; function func(){ console.log(a) var a = 5; } func() //undefined
上面代码原因在于变量提升,导致内层的a
变量覆盖了外层的a
变量。
3.2、用来计数的循环变量泄露为全局变量
var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代码中,变量i
只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
二、const
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415926; PI // 3.1415926 PI = 3; // TypeError: Assignment to constant variable.
const声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值
const foo; // SyntaxError: Missing initializer in const declaration // 对于const来说,只声明不赋值,就会报错
const的作用域与let
命令相同:只在声明所在的块级作用域内有效。
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined