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必须在初始化时进行赋值

你可能感兴趣的:(ES6 &&ES2016 and ES2017(三))