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 

猜你喜欢

转载自www.cnblogs.com/llhWeb/p/9577872.html
今日推荐