var/const/let浅析

作者: seafruit | 来源:发表于2016-09-19 11:32 被阅读0次

**出现的时期 **

var -->ES5
let const -->ES6

块级作用域

ES6以前JS以var来声明变量,以function来区分作用域,{}这种无法限定var的作用域。
ES6出现后,带来了块级作用域。if,for等可以产生一个花括号,花括号中的语句集合都属于{块},在块中定义的变量在块外是不可见的,我们把从 ' { ' 开始 ' } ' 结束的这一块称为块级作用域。
在块级作用域里,和函数作用域有相类似的地方,那就是当函数调用完成后,函数内部的变量会被销毁。那么块级作用域……请看例子!

function test(){
(function(){
    for(var i=0;i<10;i++);
})();
console.log(i);
}
test();

想想看会输出什么?结果是 i 未定义。为什么呢?这是因为js的闭包特性,for 语句在闭包内,当function被调用结束后,i被销毁,所以访问不到。

暂时性死区

暂时性死区(TDZ)是真正短暂的(基于时间),和不受空间条件限制的(基于位置)。

if(true){
    const fun = function(){//TDZ begin
        console.log(myVar);//OK
    }
    …
    let myVar = 3;//TDZ end
    fun();//TDZ 外部
}

变量提升

函数提升是把后面的变量都提到前面去。
这个还是用例子来说

function test(){
    console.log(say);   
    var say = ' Hello ! ' ;   
}

不会报错,输出undefined;
因为变量提升,会将上面的变成

function test(){
    var say;
    console.log(say);   
    say = ' Hello ! ' ;   
}

这个还是非常好理解的,如果你还在使用ES5的话,那就在书写的时候最好自己手动提升,这样,编程的时候不容易出错。

函数提升

函数提升是把整个函数都提到前面去。

function test(){
    fun();
    function fun(){
        alert("fun");
    }
}
test(); 

但是这样却不行

function test(){
    fun();
    var fun =function f(){
        alert("fun");
    }
}
test(); 

WHY?
因为,JS中函数的写法,一种是函数表达式,另外一种是函数声明方式。只有函数声明形式才能被提升。

三者的区别

  • let:
    作用域是块级,不能在同一块级作用域中重复声明,拥有暂时性死区,没有变量提升。
    当进入let作用域,立即创建存储空间;获取或设置未初始的变量会抛异常,Reference error;当执行到变量声明的时候,若定义了值就赋值,若没有值,那就是udefined,变量在暂时性死区不能被访问,所以无法对它使用typeof。
  • const:
    作用域是块级,不能重复声明,并且声明的同时就要赋值,拥有暂时性死区,声明常量。
    在暂时性死区内它不能被访问(获取或设置)直到执行到达声明。
  • var:
    作用域是函数作用域,可以重复声明,没有暂时性死区,有变量提升。
    当进入var的作用域,立即为它创建存储空间,变量会立即被初始化并赋值为undefined,当执行到变量声明的时候,若变量定义了值则会被赋值。

相关文章

网友评论

    本文标题:var/const/let浅析

    本文链接:https://www.haomeiwen.com/subject/fkagettx.html