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