let和var区别
let和var的全局作用域
let 和var 声明变量在全局作用域中时 用法相似
let a = ‘apple’;
var b = ‘banana’;
但let声明的的变量不能被全局对象window调用
console.log(window.a);//显示undefined
console.log(window.b);//显示‘banana’
let和var在面试题中常出现的例子
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i);
})
}
输出结果为十个10
for(let j=0;j<10;j++){
setTimeout(function(){
console.log(j);
})
}
输出结果为0123456789
setTimeout实现异步。变量i 是用var声明的,在全局范围内有效,所以全局中只有一个变量i,每次循环时,setTimeout定时器里面的i指定的是全局变量i,循环十次,所以i都是10。
变量j是用let声明的,j只有在本轮循环中有效,每次循环的j其实都是一个新的变量,所以输出结果也会不同。
变量提升
let不存在变量提升,var存在变量提升
console.log(a);
let a = 'apple';
a 变量为not defined
变量a用let声明不存在变量提升,在声明a之前,a不存在,所以会报错
console.log(b);
var b = 'banana';
b undefined
变量b用var 声明 存在变量提升,所以在脚本开始运行时,b已经存在,但是还没有赋值,所以会输出undefined