1.var to const/let
????????在ES6之前椰棘,var就像是js中變量聲明的國王一般,但同時他也存在著些許的問題。
var作用域
????????Scope也就是聲明的變量可以提供使用的地方澡罚。var是全局作用域或者函數(shù)作用域列荔,當var在函數(shù)外聲明時敬尺,他就是一個全局作用域枚尼,也就是在任何地方都可以去訪問該變量。當var是在函數(shù)內(nèi)部進行聲明時就是函數(shù)作用域砂吞,也就意味著只能在該功能中進行訪問署恍。
var tester = "hey hi";
function newFunction() {
var hello = "hello";
}
console.log(hello); // Uncaught ReferenceError: hello is not defined
在這里我們收到了一個關(guān)于hello未定義的報錯,因為hello的作用域是在函數(shù)內(nèi)部蜻直,在函數(shù)之外是不能訪問的盯质。
Hoisted of var
????????Hoisted是JS的一種機制(https://www.w3schools.com/js/js_hoisting.asp)也就是大家常說的變量提升。它的解釋是這樣的:將聲明移動到作用域的頂部概而。
console.log (greeter);//undefined? ? ? ? ? ? ?變量已經(jīng)聲明只是未賦值
var greeter = "say hello"
? ? ? ? 同樣因為該機制呼巷,也造成了 var 的一個弱點,像下邊的例子:
var av= "va";
if (true) {
var av= "av";
}
console.log(av)? ?//"av"
????????因為條件為 true 所以av被重新賦值為“av”赎瑰,如果您是故意這么做的當然沒有問題王悍,但當你并沒有意識到之前已經(jīng)定義過一個 av 變量,那么這就變成了一個問題餐曼,當你其他的代碼中同樣用到了av變量压储,就會造成很多的錯誤。所以let以及const就變得很有必要源譬。
let
????????let 在現(xiàn)在已經(jīng)可以說是變量聲明的首選集惋,因為它解決了上邊提到的var的問題。
let作用域
????????let是屬于塊級作用域瓶佳,通俗的說就是由{}限制的作用域芋膘。用一個例子來說明一下:
if (true) {
let av= "av";
}
console.log(av)? ?//avis not defined 我們可以看到在塊外部對其進行使用時會返回未定義的錯誤。
let可以被重新賦值霸饲,但不能重新聲明
就像var一樣为朋,聲明的變量可以在其作用域內(nèi)被重新賦值,但是let的變量不能在其作用域內(nèi)被重新聲明厚脉,當然變量作用域之外則可以繼續(xù)聲明习寸。如下:
let av="av";
let av="va" //Uncaught SyntaxError: Identifier 'av' has already been declared
hoisted of let
????????同var一樣,let也存在hoisted傻工,會在塊作用域的頂部創(chuàng)建霞溪,但是與var不同的是,var將會以undefined進行賦值中捆,而let則不會初始化該變量鸯匹,在初始化該變量之前去訪問將會造成“ReferenceError”的錯誤。變量處于從塊開始到初始化的“temporal dead zone”(暫時性死區(qū))泄伪。
CONST
const用來定義一個常量值殴蓬,const聲明的變量不能重新賦值,所以必須要在聲明變量的時候?qū)ψ兞窟M行賦值蟋滴。
hoisted of const
? ? ? ? 同let一樣染厅,const聲明只能在塊級作用域內(nèi)進行訪問痘绎。
const不能重新聲明不能重新賦值
? ? ? ? 這就意味著const聲明的變量,在其塊狀作用域內(nèi)是保持不變的肖粮。它不能重新聲明或者重新賦值孤页,如下:
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"; //并不會報錯
總結(jié):
1.var聲明是全局作用域或函數(shù)作用域悲龟,let而且const是塊作用域。
2.var變量可以在其范圍內(nèi)更新和重新聲明; let變量可以更新但不能重新聲明; const變量既不能更新也不能重新聲明冰寻。
3.它們都被提升到其范圍的頂部,但var變量初始化為undefined皿渗,let并且const變量未初始化斩芭。
4.var以及l(fā)et可以在聲明時不進行賦值,但const必須在初始化時進行賦值