1.var 定义的变量 会进行变量提升:
如果变量声明在函数里面,则将变量声明提升到函数的开头
如果变量声明是一个全局变量,则将变量声明提升到全局作用域的开头
即只要定义了 即使在定义之前使用也不会报错 ,而let 定义的不会,在定义之前使用将会导致报错
console.log(k) console.log(x) let x = 10 var k = ‘ddd‘
console将打印
undefined
2.var 只有全局作用域和局部作用域之分,而let定义块级作用域 (var 定义的全局变量会自动添加到window上作为对象的属性)
for (var j = 0; j < 10; j++) {
setTimeout(function() {
console.log(j)
})
}
// 10个10
// 下面可以正常访问 会污染全局变量
console.log(‘-------‘, j)
console.log(‘-------‘, window.j)
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i)
})
}
// 0---9分别被打印
// Uncaught ReferenceError: i is not defined
console.log(‘-------‘, i)
3. var 可以被重新定义和赋值而let不行 对let进行重新赋值将会报错
let x = 10 let foo = () => { console.log(‘------------‘, x) // 不能被重新定义 下面将会报错 let x = 20 x++ } // 不能被重新定义 下面将会报错 不论全局还是局部 let x = 1 foo()
var k = ‘444‘ var k = ‘kjk‘ console.log(k) //可以正常输出
原文:https://www.cnblogs.com/xhliang/p/11971704.html