let命令javascript
为es6新增命令,用来声明变量,相似于var,可是let所声明的变量,只在let命令所在的块级做用域内有效java
块级做用域写法(ES6块级做用域容许任意嵌套):es6
// 块级做用域写法 { let tmp = ...; ... }
块级做用域例1数组
for (let i = 0; i < 10; i++) { // ... } console.log(i);
//ReferenceError: i is not defined
解析:上面代码中,i的做用域是for循环体内,在循环体外引用就会报错。函数
块级做用域例2spa
function f1() { let n = 5; if (true) { let n = 10; } return n }
console.log(f1())//5
解析:栗子说明,外层代码块不受内层代码块的影响。code
---------------------------------------------------------------------------------------------------------------------------------blog
let与var的区别ip
1.var 没有块级做用域,let有块级做用域内存
var实例
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
分析:代码中,i在全局范围内有效,因此全局只要一个变量i。每一次循环,变量i的值都会发生变化,而数组a函数内部的console.log(i),里面的i和全局i为同一个。
let实例
var a = []; for (let i = 0; i < 10; i++) {
a[i] = function () { console.log(i); }; } a[6](); // 6
分析:代码中的i使用let声明的,只在本轮循环有效,每一次循环的i其实都是一个新的变量(why?javascript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算)
另外,for
循环还有一个特别之处,就是设置循环变量的那部分是一个父做用域,而循环体内部是一个单独的子做用域。
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); }
2.var 存在变量提高,let不存在变量提高("变量提高"是指变量能够在声明以前使用,值为undefined·)
例:
/ var 的状况 console.log(foo); // 输出undefined var foo = 2; // let 的状况 console.log(bar); // 报错ReferenceError let bar = 2;
3.let暂时性死区
只要块级做用域内存在let命令,它所声明的变量的做用域就是这个区域,
例如
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
解析:tmp的做用域为块级做用域,报错缘由:未声明直接使用,
4.let不容许重复声明
let不容许在相同的做用域内,重复声明同一个变量
例子
// 报错 Uncaught SyntaxError: Identifier 'a' has already been declared function func() { let a = 10; var a = 1; } // 报错 function func() { let a = 10; let a = 1; }
扩展:不能在函数内部从新声明参数
function func(arg) { let arg; // 报错,相同的做用域内 } function func(arg) { { let arg; // 不报错 函数参数arg 和此处的arg不在同一个做用域内 } }
总结:
1.let命令有块级做用域
2.let命令先声明再使用
3.let命令不可重复声明(同一做用域)
相关资料:http://es6.ruanyifeng.com/#docs/let
做者:smile.轉角
QQ:493177502