console.log(a, b, c); var a; // 即便声明在使用之后,也不会报错,因为var变量声明和函数声明会提升到最前面执行 let b; const c;
加一个块级作用域,var 依旧不会报错:
1 2 3 4 5 6
console.log(a, b, c); { var a; let b; const c; }
而且 let 和 const 是块级作用域,写成这样也会报错:
1 2 3 4 5
{ let a; const b; } console.log(a, b);
var 无法跨闭包,报错:
1 2 3 4 5 6 7
functiona() { functionb() { var a; } console.log(a); } a();
通过 var 声明的所有全局变量和函数都会变成 window 对象的属性和方法,而 let 和 const 不会
1 2 3 4 5 6 7 8 9
var a = 1; var b = function () { console.log("b"); }; // 用function声明的也会变成全局对象的方法 functionc() { console.log("c"); } console.log(window.a, window.b, window.c);
一个经典的坑
1 2 3 4 5
for (var i = 0; i < 6; i++) { setTimeout(() => { console.log(i); // 输出全部是6 }); }
使用 let 可以避免此问题:
1 2 3 4 5
for (let i = 0; i < 6; i++) { setTimeout(() => { console.log(i); // 输出全部是6 }); }
也可以用闭包来解决此问题,let 是 es6 引进的,实际上在 es5 一般就是用闭包来解决问题:
1 2 3 4 5 6 7 8
functionfn(i) { setTimeout(() => { console.log(i); }); } for (let i = 0; i < 6; i++) { fn(i); }