const & let

前世

在 const & let 还未出现前,JS 的世界一直是 var的统治

var:在JS中用于变量声明的关键字。浏览器

特色:闭包

  1. 变量提高
  2. 只有函数做用域或者全局做用域,没有块级做用域
  3. 重复声明变量
  4. 循环体重的闭包会出现问题

    …….函数

变量提高this

function test(tag) {
    console.log(a,b);   // a,b在下面声明,可是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
}

在浏览器预解析机制中,加载函数的时候,此时的做用域为函数做用域,函数做用域中JS会先将全部的声明置顶。code

function test(tag) {
    var a,b;            // 将声明置顶,可是赋值并不会
    console.log(a,b);   // a,b在下面声明,可是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
}

只有函数做用域以及全局做用域,没有块级做用域作用域

function test(tag) {
    console.log(a,b);   // a,b在下面声明,可是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
    
    console.log(a);        // 9
}

test(8)  // 9

按照其余语言规则 if 是一个程序块,在 if 中声明的变量做用域只能在 if 中,可是 JS 由于只有函数做用域和全局做用域,因此才会致使在 if 判断外还能够访问 if 的变量io

重复声明变量console

var a = 1;
var a = 2;

console.log(a); // 2

在使用var的时候容许重复声明变量也是使人头痛的事情,也许由于这个机制,可能就会出现bugfunction

循环体重的闭包会出现问题class

var arr = [];
for(var i = 0; i < 3; i++) {
    arr.push(function () {
        return i;
    })
}

for(var j = 0; j < 3; j++) {
    console.log(arr[j]());    // 3,3,3
}

将var -> let
将会打印出 0,1,2

由于缺少块做用域因此致使问题出现

此生

现在距离ES6规范的出现已通过去了4年多了,在项目中也早已开始大量使用ES6规范编写代码了。var也再也不是JS世界的惟一了,

JS 世界出现了const & let。

const & let 的出现给JS带来了块级做用域,解决了变量提高,禁止了重复声明变量,让JS少了不少疑惑的地方。

let & const

相同点:

  1. 具备块级做用域
  2. 禁止重复声明变量
  3. 不会产生变量提高

区别:

let

使用let声明的基本类型变量是能够改变值

let a = 12;
a = 13;
return a;    // 13

使用let声明引用类型的变量是能够改变引用的

let info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

let heInfo = {};

heInfo = info;

heInfo.name = "Jack";

console.log(heInfo);

const

使用const声明的基本类型变量是不能够改变值

const a = 13;
a = 14;
return a; // 报错

使用const声明引用类型的变量是不能够改变引用的

const info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

const heInfo = {};

heInfo = info;        // 报错
    
heInfo.name = "Jack";

console.log(heInfo);

可是咱们能够操做const声明的引用类型的属性值

const info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

info.language = "js";

console.log(info);

总结

以前对于const的理解有误差,因此就写这篇文章。var时代已通过去了,ES6各类特性用起来。

相关文章
相关标签/搜索