let命令:
基本用法
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
if:::::
{
var a = 100;
let b = 200;
}
console.log(a); //100
console.log(b); //b is not defined -- Error
不存在变量提升
let不像var那样,会发生“变量提升”现象。
//ES5
console.log("ES5:");
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = function () {
console.log(c);
};
};
a[5](); //9
//ES6
console.log("ES6:");
var b = [];
for (var j = 0; j < 10; j++) {
let d = j;
b[j] = function () {
console.log(d);
};
};
b[5](); //5
暂时性死区
{
console.log(a); //undefined
let a = 100;
console.log(a); //100
}
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var a = 100;
{
console.log(a); //undefined
let a = 100;
console.log(a); //100
}
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量
// 模块之间不影响,可以重复声明
{
var a = 100;
var a = 200;
console.log(a); //200
}
{
let a = 300;
console.log(a); //300
}
// 模块内部不允许用let命令重复声明
{
var a = 1;
let a = 2; //输出后会报错
}
===========================================================
为什么需要块级作用域?
ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会覆盖外层变量。
var time = new Date();
function fun() {
console.log(time);
if (false) {
var time = "Hello World!";
};
};
//time="hello world" 把外部的new Date 覆盖了
fun(); //undefined
第二种场景,用来计数的循环变量泄露为全局变量。
var string = "Hello World!";
for (var i = 0; i < string.length; i++) {
console.log(string[i]);
};
console.log("循环结束");
//i跳出的循环体,没有被完全释放出来。
console.log(i); //12
=========================================================
<script type="text/javascript">
console.log("ES5:");
function fun() {
var num = 100;
if (true) {
var num = 200;
};
console.log(num);
};
fun(); //200
</script>
<script type="text/traceur">
console.log("ES6:");
function fun() {
let num = 100;
if (true) {
let num = 200;
};
console.log(num); //num没有受到let num =200的影响
};
fun(); //100
</script>
案例二:
<script type="text/traceur">
console.log("ES6:");
function fun() {
console.log("I am outside!");
};
(function () {
if (false) {
function fun() {
console.log("I am inside!");
};
};
fun();
}()); //I am outside!
</script>
===========================================================
网友评论