1.声明提升
console.log(a)
//Uncaught ReferenceError: a is not defined
此时报错a 没有定义
使用var 声明变量,声明会提升到顶部
console.log(b)
var b = 12
console.log(b)
输出的结果依次是:undefined 12 12
//等价于
var b
console.log(b)
b=12
console.log(b)
使用let 声明变量不会提前
console.log(c)
let c=121
console.log(c)
代码报错c没有被定义,代码不会往下执行
在函数内部用var声明变量,只会提升到函数内部的最顶部
function add(a,b){
var sum = a+b;
return sum;
}
var sum1= add(1,2);
var sum2 = add(3,4);
//等价于
var sum1
var sum2
function add(a,b){
var sum
sum = a+b;
return sum
}
sum1 = add(1,2)
sum2 = add(3,4)
2.作用域
var 声明的变量只有函数能限制他的范围,作用域是函数作用域
if(true){
var a = 1;
}
console.log(a)
输出结果1
var dd =11
{
var dd =1;
console.log(dd)
}
console.log(dd)
输出结果: 1 1
function f(){
var a = 12
}
console.log(a)
报错:ff 没有定义,代码不会往下执行
let声明的变量任何花括号都可以限制其声明范围,作用域是块级作用域
if(true){
let a = 11;
}
console.log(a)
报错a 没有定义
let aa= 12
{
let aa = 1
console.log(aa)
}
console.log(aa)
//输出结果: 1 12
function f(){
let a =12;
}
console.log(a)
报错asd没有定义
3.for循环中的setTimeout的区别
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)
}
输出结果: 0 1 2
隔1,2,3秒 输出3(输出3次)
for(let i=0;i<3;i++){
console.log(i);
setTimeout(function(){
console.log(i)
},1000)
}
等价于
{
let i=0;
console.log(i);
setTimeout(function(){
console.log(i)
},1000)
}
{
let i=1;
console.log(i);
setTimeout(function(){
console.log(i)
},1000)
}
{
let i=2;
console.log(i);
setTimeout(function(){
console.log(i)
},1000)
}
输出结果: 0 1 2
隔1秒以后分别输出 0 1 2
4.重复声明
var a =1;
var a =2;
不会报错,var 声明的变量可以重复声明
let a =1;
let a =2;
报错 ,let声明的变量不可以重复声明,会报重复声明的错误
5.全局对象属性
var 全局声明的变量可以绑定在window上,直接window.***可以拿到该数据,let声明的变量,用window.****是undefined
var a = 12;
window.a
//输出12
function add(a,b){
var sum = a+b;
return sum;
}
window.add(1,2)
//输出:3
let a = 12;
window.a
//undefined
6.总结
let 是ES6新增的语法,var是老语法,今后代码中尽量全部用let ,弃用var.因为var有上面这些不好的特性。
区别总结:
1.var 会声明提升,let 不会
2.var 是函数作用域,let 是块级作用域
3.var 允许重复声明,let 不会
4.var 声明的全局变量,会成为全局对象的属性,let不会