let 和 const

2018-11-27  本文已影响0人  暖年的咆哮

1. var

ES5声明变量的关键字,
如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。
存在变量提升

2. let 命令

1、在let之前出现let定义的变量会报未定义的错误,是因为let定义的变量不会进行变量提升
2、let的作用域只在当前作用域也就是一对花括号之间生效,
3、let不能重复定义,
4、函数内不能用let重新声明函数的参数
5、再let之前使用typeof,会报错,因为变量不会提升,let之前的区域相当于暂时性死区(TDZ)

注:暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,不可使用,只有等到声明变量的哪一行代码出现,才可以获取和使用该变量

3.const命令

1、不可修改
2、只在块级作用域起作用,这点与let关键字一样。
3、不存在变量提升,必须先声明后使用,这点也跟let关键字一样。
4、不可重复声明同一个变量,这点跟let也一样。
5、声明后必须要赋值
6、定义的常量如果是引用类型,需注意址传递问题

例如,const定义的常量是数字,字符串,布尔值等基本类型,那么它就是不可更改的,但是如果const定义的常量是object,那么实际上const只是定义了object的内存地址,而object实际上是可以更改的。

如果真的想定义一个不可更改的引用类型的const,那么可以使用object.freeze({})方法。 这个方法可以称之为冻结常量方法;

4. ES6声明变量的6种方法:

    ES5中声明变量只有2中方法,var和function,
    ES6中新增加了let,const,import,和class命令。

5.ES6块级作用域

为什么需要块级作用域:
因为在多人开发的时候,很容易出现变量同名,造成代码冲突,为了避免这种情况,便有了块级作用域,块级作用域内部的变量不会影响块级作用域外部的变量,
ES5的作用域只分为函数作用域和全局作用域,var变量会经常出现冲突。
ES6允许块级作用域的任意嵌套
内层作用域不会影响外层作用域的变量,所以内层作用域可以和外层作用域同名
ES5中规定,函数,只能在顶层作用域和函数作用域中声明,不能再块级作用域之中声明,但是浏览器并未遵守此约定,
ES6中规定,在块级作用域中,函数声明语句类似于let,只作用与当前作用域中,但是会此声明会被提升到此作用域顶部,块级作用域之外不可引用。
由于ES5和ES6的环境导致行为差异太大,所以应该避免在块级作用域中声明函数,如果确实需要,应该写成函数表达式的形式,而不是函数声明语句。
上一篇 下一篇

猜你喜欢

热点阅读