在 JavaScript 开发中,let 和 var 的选用直接影响作用域和行为。
let 是在 ES6 中引入的
ES6 新增了 let 命令,用来声明局部变量。它的用法类似于 var,但所声明的变量只在 let 所在的代码块内有效,且有暂时性死区的约束。
先看个常见的变量提升面试题:
var a = 99;
f(); // f 是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部
console.log(a); // a=>99,此时是全局变量的 a
function f() {
console.log(a); // 当前的 a 变量是下面变量 a 声明提升后,默认值 undefined
var a = 10;
console.log(a); // a => 10
}
// 输出结果: undefined 10 99
ES6 之前,我们通常用 var 来声明变量。JS 只有函数作用域和全局作用域,没有块级作用域,所以 {} 限定不了 var 声明变量的访问范围。
例如:
{ var i = 9; }
console.log(i); // 9
ES6 新增的 let 可以声明块级作用域的变量。
{ let i = 9; // i 变量只在花括号内有效!!!}
console.log(i); // Uncaught ReferenceError: i is not defined
let 配合 for 循环的独特应用
let 非常适合用于 for 循环内部的块级作用域。JS 中的 for 循环体比较特殊,每次执行都是一个全新的独立块作用域。用 let 声明的变量传入到 for 循环体的作用域后,不会发生改变,不受外界的影响。
看一个经典的面试题:
( i = ; i < ; i++) {
(() {
.(i);
}, );
}

