functionfn() { console.log(i); // undefined console.log(test); // undefined for (var i = 0; i < 5; i++) { var test = "hello!"; var test = "world!"; // todo ... } console.log(i); // 5 console.log(test); // world! }
fn();
以上这段代码暴露了var的不合理性,这也经常成为面试题的一种来调戏很多同学。
变量声明提升。
作用域问题。var变量的作用域有两种:全局级和函数块级,而这经常会带来困扰。
可以重复声明。尤其是在多人协作开发时,这种变量覆盖会导致隐形 bug。
let & const: 前辈的不足,我来弥补!
这小伙子前途无量啊…
相比var,let和const做到了:
块级作用域。
同级作用域下,不允许重复声明。
不会在顶层对象上创建相应的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 1. 块级作用域。 if (true) { let a = 1; } console.log(a);
// 2. 同级作用域下,不允许重复声明。 let b = 1; let b = 2; // 报错
// 3. 不会在顶层对象上创建相应的属性。 var c = 1; let d = 1; console.log(this.c); // 1 console.log(this.d); // undefined
{ console.log(hamburger); // ReferenceError let hamburger = "🍔";
console.log(typeof pizza); // Uncaught ReferenceError: pizza is not defined const pizza = "🍕";
var apple = "🍎"; if (apple) { // 赋值语句是从右往左执行的,apple + '🍎' 中的apple 是 let apple 的这个apple... 而不是 var apple = '🍎' 的apple... 😄 // 所以右边执行的时候那个apple还没初始化,所以apple还在TDZ当中... let apple = apple + "🍎"; // Uncaught ReferenceError: Cannot access 'apple' before initialization } }