es5声明变量的问题
1.全局变量挂载到全局对象:全局对象成员污染问题。
let声明的变量不会挂载到全局对象。
2.允许重复的变量声明,导致变量被覆盖。
let声明的变量不允许当前作用域范围内重复声明。
3.变量提升:怪异的数据访问,闭包问题。
使用let不会有变量提升,因此,不能在定义变量之前使用它
底层实现上,let声明的变量实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访问的变量位于暂时性死区,则会报错。当代码运行到公司变量的声明语句时,会将其从暂时性死区移除。
在循环中,用let声明的循环变量会特殊处理,每次进入循环体都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)。
在循环中使用let声明的循环变量,在循环结束后会销毁。
for (let i = 0; i < 10; i++) {
var btn = document.createElement('button');
btn.innerHTML = "按钮" + i;
document.getElementById('main').appendChild(btn);
btn.onclick = function(){
console.log(i)
}
}
console.log(i) //报错
console.log(name); //报错
let name = "abc";