首先, es6是采用严格模式的, 在es5中如果要使用严格模式, 我们需要在 js 文件首行声明 "use strice" 块作用域 let 先看下面一段代码 function test() { for (var i = 0; i < 3; i++) { console.log(i) // 0 1 2 } console.log(i) // 3 } test() 这里 var 声明的变量 i , 在块的外边是可以拿到的, es6出现了块作用域, 通俗理解就是 { } 之内的域, var 声明的变量可以在同级块之外拿到 下列代码把 var 改成 let 之后 function test() { for (let i = 0; i < 3; i++) { console.log(i) // 0 1 2 } console.log(i) // Uncaught ReferenceError: i is not defined } test() 这里就拿不到声明的 i 变量了, 因为他只属于 for 循环这个 { } 块之中 注意 Uncaught ReferenceError: i is not defined 为什么报引用错误而不是 undefined ? 这就是因为 es6 默认采用的严格模式, 严格模式下变量未声明就不能引用 另外同一个变量名不能用 let 重复声明,