ES6 --- let、const与作用域

一、let
1.1 学习let,首先我们来看一段代码:

function test(){
    for(var i=0;i<3;i++){
        console.log(i)  //1,2
    }
    console.log(i)      //3
}

test();

这组代码中,我们使用的是var来声明变量来循环,所以在循环内打印出1,2。在循环外打印出3,这个应该都是可以理解的。下面来看下let的区别:

function test(){
    for(let i=0;i<3;i++){
        console.log(i)  //1,2
    }
    console.log(i)      // Uncaught ReferenceError:i is not defined 引用错误
}

test();

在这里,我们可以看到浏览器报了引用错误—Uncaught ReferenceError,那为什么会报引用错误呢,这里就涉及到标题中提到的作用域的问题。在ES6中,有一个新的概念, 块作用域

1.2 块作用域

代码用{}包裹,就是一个块作用域

所以 —- let 声明的变量只在自己所在的块作用域中有效,const方法定义的常量也有这样的概念。

一般我们console.log()一个未声明的变量,会报undefined错误,那我们这里为什么会报引用错误呢,不是定义错误?

如果使用了es6,强制开启了严格模式,在es5中使用”use strict”;
严格模式中,变量未声明不能使用,不然就会报引用错误

1.3 let 重复声明同一个变量

function test(){
    let a = 1;
    let a =2; // Duplicate declaration "a"  重复声明 a
}
test()

所以使用let在同一个作用域不能重复声明同一个变量。


二、const

2.1 常量

在es5中是没有常量的概念的,在es6中引入了const常量。来看一个案例:

function test(){
    const PI = 3.14;
    PI = 8 //"PI" is read-only
    console.log(PI);
}
test()

这里声明了一个常量 PI ,下面我们给PI重新赋值,这个时候浏览器就会报 "PI" is read-only 错误,这个错误的意思就是 PI 只是一个可读属性不能修改。但其实这句话是不严谨的,后面我们会做出解释。

2.2 Unexpected token
这个标题我想大家都认识,是一个错误提示,那const什么情况下会出现这样的错误提示呢

function test(){
    const PI ; // Unexpected token  (输入的不完整)
    PI = 8;
}
test()

我们先定义了PI常量,但是没有给它赋值,后面我们才赋值为8,但是在浏览器中,出错了,在定义的位置,报Unexpected token (输入的不完整) , const 声明的时候是必须赋值,不然就会报错,大家要记住哦。

2.3“修改”const 常量
看到标题大家可能都比较疑惑啊,之前还说不能修改常量的值,现在怎么变了。其实我们的修改是引号引起来的,所以就不是真正的修改了常量,只是看起来是这样而已。

function test(){
    const PI = 3.14; 
    const k = {
        a:1
    };
    k.b = 3;   // 
    console.log(PI, k); // 3.14 a:1,b:3
}
test()

在这部分代码中,我们定义了k对象,然后给k添加了b = 3;这个时候我们发现,并没有报错,那是为什么呢?

对象允许修改属性,数值等基本类型不允许修改,对象返回的是内存指针,指针不变,就还是同一个对象,这个也是对象中一个知识点,所以我们只是改变了对象中的内容,但是指针不变,也就不存在修改个这个常量了。

下一期,我们来说说 解构赋值

猜你喜欢

转载自blog.csdn.net/wangdan_2013/article/details/79465782