ES6 &&ES2016 and ES2017(三)

1.var to const/let

        在ES6之前,var就像是js中变量声明的国王一般,但同时他也存在着些许的问题。

var作用域

        Scope也就是声明的变量可以提供使用的地方。var是全局作用域或者函数作用域,当var在函数外声明时,他就是一个全局作用域,也就是在任何地方都可以去访问该变量。当var是在函数内部进行声明时就是函数作用域,也就意味着只能在该功能中进行访问。

var tester = "hey hi";

function newFunction() {

var hello = "hello";

}

console.log(hello); // Uncaught ReferenceError: hello is not defined

在这里我们收到了一个关于hello未定义的报错,因为hello的作用域是在函数内部,在函数之外是不能访问的。

Hoisted of var

        Hoisted是JS的一种机制(https://www.w3schools.com/js/js_hoisting.asp)也就是大家常说的变量提升。它的解释是这样的:将声明移动到作用域的顶部。

console.log (greeter);//undefined             变量已经声明只是未赋值

var greeter = "say hello"

        同样因为该机制,也造成了 var 的一个弱点,像下边的例子:

var av= "va";

if (true) {

var av= "av";

}

console.log(av)   //"av"

        因为条件为 true 所以av被重新赋值为“av”,如果您是故意这么做的当然没有问题,但当你并没有意识到之前已经定义过一个 av 变量,那么这就变成了一个问题,当你其他的代码中同样用到了av变量,就会造成很多的错误。所以let以及const就变得很有必要。

let

        let 在现在已经可以说是变量声明的首选,因为它解决了上边提到的var的问题。

let作用域

        let是属于块级作用域,通俗的说就是由{}限制的作用域。用一个例子来说明一下:

if (true) {

let av= "av";

}

console.log(av)   //avis not defined 我们可以看到在块外部对其进行使用时会返回未定义的错误。

let可以被重新赋值,但不能重新声明

就像var一样,声明的变量可以在其作用域内被重新赋值,但是let的变量不能在其作用域内被重新声明,当然变量作用域之外则可以继续声明。如下:

let av="av";

let av="va" //Uncaught SyntaxError: Identifier 'av' has already been declared

hoisted of let

        同var一样,let也存在hoisted,会在块作用域的顶部创建,但是与var不同的是,var将会以undefined进行赋值,而let则不会初始化该变量,在初始化该变量之前去访问将会造成“ReferenceError”的错误。变量处于从块开始到初始化的“temporal dead zone”(暂时性死区)。

CONST

const用来定义一个常量值,const声明的变量不能重新赋值,所以必须要在声明变量的时候对变量进行赋值。

hoisted of const

        同let一样,const声明只能在块级作用域内进行访问。

const不能重新声明不能重新赋值

        这就意味着const声明的变量,在其块状作用域内是保持不变的。它不能重新声明或者重新赋值,如下:

const av ;//Uncaught SyntaxError: Missing initializer in const declaration

const av="av";

av="va";  //Uncaught TypeError: Assignment to constant variable.

当const去声明一个对象是,这在某种程度上不同于const,虽然const的对象不能被更新,但是对象的属性是可以被更新的。如下:

const av={

ny:“cjk”

}

av.ny="lzll"; //并不会报错

总结:

1.var声明是全局作用域或函数作用域,let而且const是块作用域。

2.var变量可以在其范围内更新和重新声明; let变量可以更新但不能重新声明; const变量既不能更新也不能重新声明。

3.它们都被提升到其范围的顶部,但var变量初始化为undefined,let并且const变量未初始化。

4.var以及let可以在声明时不进行赋值,但const必须在初始化时进行赋值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,208评论 0 13
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 3,046评论 3 37
  • let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...
    卞卞村长L阅读 622评论 0 0
  • let 和 const 命令 let 命令 块级作用域 const 命令 顶层对象的属性 gl...
    安小明阅读 998评论 0 0
  • 在很久很久以前,在一个平常人家里,诞生了一个十分漂亮的女婴,那女婴长着一张娇俏动人的鹅蛋脸,双眼炯炯有神,还未长大...
    雨后乍逢阅读 587评论 1 2