在讲let命令之前,先来回顾一下var的一些特性和用法。
var:用于声明变量的命令
1、作用域:(ES5中仅有函数作用域&全局作用域)
(1)如果在一个函数之内用var声明变量,则其在该函数内有效,其外部环境无法访问到这个变量,且该变量在函数内会覆盖全局变量的声明。
- var a = 6;
- function hh()
- {
- var a = 4;
- alert(a);
- }
- hh();//4
- alert(a);//6
(2)如果一个变量在全局环境中声明,则其在整个window中有效。在ES5中,全局对象的属性与全局变量是等价的。
window.a = 5; === var a =5;
2、ES5中var声明的变量存在变量提升(仅是声明提升,赋值不提升),可允许变量在声明之前使用;
- alert(b);//undefined
- var b = 5;
其执行顺序其实是:
- var b;
- alert(b);
- b = 5;
3、ES5中用var可以重复声明变量
- var c = 5;
- alert(c);//5
- var c = 10;
- alert(c);//10
接下来讲let的特性与用法
let:ES6中用于声明变量的新命令,其用法类似于var,但其声明的变量只在let命令所在的代码块内有效。
(什么叫代码块?{}一个大括号内的内容即可为一个代码块)
1、作用域:let命令所在的代码块
- {
- let a = 10;
- var b = 1;
- }
- a //ReferenceError: a is not defined
- b//1
2、let不存在变量提升,变量一定要在声明之后使用,否则报错
(暂时性死区:只要块级作用域内存在let命令,它所声明的变量就绑定了这个作用域,不在受外部影响,在代码块内,使用let命令声明变量之前,该变量都是不可用的)
- console.log(foo);//ReferenceError
- let foo = 2;
3、let不允许在相同作用域重复声明同一个变量(包括不能在函数内部重新声明参数)
- let t = 5;
- alert(t);
- let t = 8;
- alert(t); VM51:3 Uncaught SyntaxError: Identifier 't' has already been declared
- let t = 5;
- alert(t);//5
- {let t = 8; alert(t);//8} //不在同一作用域了