以下内容都摘自https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let
参考https://es6.ruanyifeng.com/#docs/let#let-%E5%91%BD%E4%BB%A4
let语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
一、demo
let x = 1;
if (x === 1) {
let x = 2;
console.log(x);
// expected output: 2
}
console.log(x);
// expected output: 1
二、语法
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
参数
var1, var2, …, varN
变量名。必须是合法的标识符。
value1, value2, …, valueN
变量的初始值。可以是任意合法的表达式。
三、描述
let允许你声明一个作用域被限制在 块级中的变量、语句或者表达式。
与 var 关键字不同的是, var声明的变量只能是全局或者整个函数块的。 var 和 let 的不同之处在于后者是在编译时才初始化(见下面)。
就像const 一样,let不会在全局声明时(在最顶部的范围)创建window 对象的属性。
四、作用域规则
let声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数。
function varTest() {
var x = 1;
{
var x = 2; // 同样的变量!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
{
let x = 2; // 不同的变量
console.log(x); // 2
}
console.log(x); // 1
}
在程序和方法的最顶端,let不像 var 一样,let不会在全局对象里新建一个属性。比如:
位于函数或代码顶部的var声明会给全局对象新增属性, 而let不会。例如:
var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined