1.声明提升
for(var i=0;i<3;i++) {
console.log(i)
setTimeout(function() {
console.log(i)
},1000)
}
等同于
var i;
for(i=0;i<3;i++) {
console.log(i)
setTimeout(function() {
console.log(i)
},1000)
}
结果打印1,2,3,3, 3, 3
使用var 定义的变量 会声明提升,可以先使用后声明
for(let i=0;i<3;i++) {
console.log(i)
setTimeout(function() {
console.log(i)
},1000)
}
分析
{
i=0
console.log(0)
setTimeout(function() {
console.log(0)}
,1000)
}
{
i=1
console.log(1)
setTimeout(function() {
console.log(1)
})
}
{
i=2
console.log(2)
setTimeout(function() {
console.log(2)
})
}
结果打印 012 012
2.作用域
if(true){
var i=1;
}
console.log(i)
结果打印1 if的花括号不能限制var定义的变量
function f(){
var i=1
}
console.log(i)
结果报错,函数的花括号能限制var声明变量的范围
{
var a =1
}
console.log(a)
结果打印1 只有函数能限制var声明变量范围
function f(){
let i=1
}
{
let i=1
}
if() {
let i=1
}
console.log(i)
结果报错 任何花括号都能限制let声明变量的范围
3.重复声明
var i=1
var i=2
可以,不推荐
let i=1
let i=2
报错,不允许重复定义
4.全局对象属性
var hi = 'nihao'
window.hi
使用var声明的全局变量 会成为全局对象window的属性
let hi = 'nihao'
window.hi
结果 undefind
总结 let是ES6新增的语法,var是老语法,代码中尽量全部用let, 弃用var。var有上面不好的特性
区别总结:
1 var 会声明提升,let不会
2 var 是函数作用域,let 是块级作用域
3 var 允许重复声明,let 不允许
4 var 声明的全局变量,会成为全局对象的属性, let不会