let和var的区别2
作用范围不同:
let作用于代码块(即{})中;
var作用于函数中;
function fn1(){ for(var i=0;i<3;i++){ //for循环1 setTimeout(function(){ console.log(i);//3,3,3 },0) } for(let j=0;j<3;j++){ //for循环2 setTimeout(function(){ console.log(j);//0,1,2 },0) } console.log(i);//3 console.log(j);//报错,错误信息:Uncaught ReferenceError: j is not defined } 结果输出顺序:先输出3>后提示报错信息>然后输出3,3,3>最后输出0,1,2。
代码执行原理:先同步后异步。
循环1和循环2的输出结果不一致问题解析:
循环2结果解析:
let 不存在变量提升,所以每次循环都会执行一次,声明一个新变量(只是初始化的值不一样)。for 的每次循环都是不同的块级作用域,而 let 声明的变量是块级作用域的,所以也不存在重复声明的问题。
循环1结果解析:
var的作用于范围是函数内,又因setTimeout中异步函数后执行,执行时i变量值为3,所以输出结果均为3。
声明提升区别:
let声明的变量不会提升;
var声明的变量会提升到作用域的头部;
示例:
function fn2(){
console.log(v);//undefine
console.log(l);//报错,错误信息:Uncaught ReferenceError: l is not defined
var v = 1;
let l = 2
}
重复声明区别:
let不允许在相同作用域内重复声明;
var可以在相同作用域内重复声明
function fn3(){
var a = 1;
let a =1;
}
fn3();//报错,错误信息:Uncaught SyntaxError: Identifier 'a' has already been declared
function fn4(){
let a = 1;
let a = 1;
}
fn4();//报错,错误信息:Uncaught SyntaxError: Identifier 'a' has already