摘要:同時(shí)這個(gè)變量立即被初始化,初始值為當(dāng)語句執(zhí)行到賦值語句時(shí),這個(gè)變量改變其初始值。對(duì)一個(gè)還未初始化的變量進(jìn)行操作將會(huì)引起。循環(huán)和循環(huán)使用申明變量時(shí)和循環(huán)一樣。的運(yùn)行過程和三者的表現(xiàn)和在循環(huán)過程中相似。
let和const
標(biāo)簽(空格分隔): es6
let命令這個(gè)命令是用來申明變量的,但是和es5不同的是,用它來聲明的變量是局部變量,存在于局部作用域(blocked scope):
var a = 1; console.log(this.a); ===> 1 let a = 1;(局部變量,不會(huì)掛載在window或global下) console.log(this.a); ===> undefined
此外,在寫es5的時(shí)候經(jīng)常會(huì)遇到變量提升的情況,比如:
if(true) { console.log(a); ====> undefined var a = 1; } if(true) { console.log(a); ====> 報(bào)錯(cuò) let a = 1; }
即,如果使用let進(jìn)行變量申明的話,一定要先申明再使用
const命令聲明一個(gè)immutable(不可改變)的變量,而使用let申明的變量是mutable。但是需要注意的地方是使用const申明的變量是這個(gè)變量的本身只可能有一個(gè)值,是immutable的,但是并不指著個(gè)值是immutable的。這個(gè)值還是可以改變的。例如:
cosnt obj = {}; //使用const聲明了一個(gè)immutable的變量 obj = {} //重新對(duì)這個(gè)變量賦值,那么就會(huì)報(bào)錯(cuò)了 const obj = {}; obj.name = "XL"; console.log(obj); // {name: "XL"}這個(gè)時(shí)候是正常的temporal dead zone
通過let或const聲明的變量都有一個(gè)temporal dead zone(TDZ):當(dāng)進(jìn)入這個(gè)TDZ時(shí),如果語句沒有執(zhí)行到申明這個(gè)變量時(shí),在此之前get或者set這個(gè)變量都是會(huì)報(bào)錯(cuò)的.但是通過var申明的變量沒有TDZ。
通過var申明的變量的生命循環(huán)當(dāng)進(jìn)入到var變量的作用域中時(shí),便為這個(gè)變量分配了存儲(chǔ)空間。同時(shí)這個(gè)變量立即被初始化,初始值為undefined.
當(dāng)語句執(zhí)行到賦值語句時(shí),這個(gè)變量改變其初始值。
通過let申明的變量的生命循環(huán)當(dāng)進(jìn)入let申明變量的作用域中時(shí),為這個(gè)變量分配了存儲(chǔ)空間。但是這個(gè)變量并未沒初始化。
對(duì)一個(gè)還未初始化的變量進(jìn)行get/set操作將會(huì)引起ReferenceError。
當(dāng)語句執(zhí)行到賦值語句時(shí),這個(gè)變量改變其初始值。
const聲明的變量必須一開就要賦值,并且這個(gè)變量不能被賦予新的值。
const a; a = "XL"; ====> 報(bào)錯(cuò)在循環(huán)中的表現(xiàn): var VS let VS const
for
for-in
for-of
for循環(huán)當(dāng)中const arr = []; for(var i = 0; i < 3; i++) { arr.push(() => i); } arr.map(x => x()); //[3, 3, 3]
通過使用var申明變量時(shí),會(huì)為這個(gè)值進(jìn)行一次賦值,每次循環(huán)時(shí)都會(huì)重新對(duì)這個(gè)變量進(jìn)行賦值。因此最后輸出時(shí),返回的是相同的值
const arr = []; for(let i = 0; i < 3; i++) { arr.push(() => i); } arr.map(x => x()); //[0, 1, 2]
使用let申明變量的時(shí)候。每次循環(huán)過程,都相當(dāng)于在一個(gè)新的blocked scope里面聲明一個(gè)變量,它們相互之間沒有影響,因此最后返回的值也不相同。
for-of循環(huán)和for-in循環(huán)const arr = []; for(var i of [0, 1, 2]) { arr.push(() => i); } arr.map(x => x()); //[2, 2, 2]
使用var申明變量時(shí)和for循環(huán)一樣。
const arr = []; for(let i of [0, 1, 2]) { arr.push(() => i); } arr.map(x => x()); //[0, 1, 2]
使用let進(jìn)行循環(huán)時(shí)和for循環(huán)一樣。
使用const所達(dá)到的效果和let相同,不過通過const申明的變量是immutable的。
for-in的運(yùn)行過程和三者的表現(xiàn)和在for-of循環(huán)過程中相似。
parameters如果使用let去申明一個(gè)和形參名字相同的變量的時(shí)候,將會(huì)報(bào)錯(cuò)
function func(arg) { let arg; //static error: duplicate declaration of "arg" }
但是如果使用var去申明的話,則不會(huì)報(bào)錯(cuò),其達(dá)到的效果就是重新聲明一個(gè)變量覆蓋的掉了形式參數(shù)。
function func(arg) { var arg; }Coding style: const VS let VS var
如果你要定義一個(gè)immutable varity(原始值和Forzen Objects)時(shí),盡量使用const。
如果要定義一個(gè)初始值可能會(huì)發(fā)生變化的變量時(shí),盡量使用let。
在全局環(huán)境下通過var來申明的變量是可以掛載到全局對(duì)象(window/global),但是你完全可以通過直接在window/global去定義這個(gè)變量/屬性。
參考:
exporing es6
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80270.html
一、塊級(jí)作用域 1. var 首先看看ES5中得變量聲明方式 if (true) { var a = 2 } console.log(a) // 2 以上代碼等同于 var a if (true) { a = 2 } console.log(a) 以上可知 : 在塊內(nèi)部定義變量 變量提升,到函數(shù)最頂部 通過var聲明的變量,無論在何處聲明,均為全局作用域 2.let 和 ...
摘要:函數(shù)調(diào)用會(huì)在內(nèi)存形成一個(gè)調(diào)用記錄,又稱調(diào)用幀,保存調(diào)用位置和內(nèi)部變量等信息。等到運(yùn)行結(jié)束,將結(jié)果返回到,的調(diào)用幀才會(huì)消失。方法用于將一組值,轉(zhuǎn)換為數(shù)組。,和遍歷數(shù)組方法返回一個(gè)布爾值,表示某個(gè)數(shù)組是否包含給定的值,與字符串的方法類似。 ES6 簡(jiǎn)介 ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個(gè)版本標(biāo)準(zhǔn),2015.06 發(fā)版。 let 和 const...
摘要:和不同,沒有變量提升,聲明之前,該變量都是不可用的。聲明創(chuàng)建一個(gè)只讀的常量。這不意味著常量指向的值不可變,而是變量標(biāo)識(shí)符的值只能賦值一次。聲明同時(shí)必須賦值。 LET和const命令 var 變量聲明提升原則 var語句聲明的變量的作用域是當(dāng)前執(zhí)行位置的上下文 給一個(gè)非聲明變量賦值會(huì)隱式創(chuàng)建一個(gè)全局變量(全局object的一個(gè)屬性),注意這里是非聲明賦值 聲明和賦值是兩回事,注意區(qū)分,...
摘要:所以,最終極的辦法是一層一層凍結(jié)所有對(duì)象。塊級(jí)作用域使呈現(xiàn)出塊級(jí)作用域的特征。聲明的變量?jī)H存在于當(dāng)前塊級(jí)作用域中。在中,嚴(yán)格模式下等價(jià)于使用聲明,非嚴(yán)格下等價(jià)于使用。在中使用聲明的變量,為了保持程序的嚴(yán)謹(jǐn)性,不允許被訪問。 let和const都是聲明變量的新方式。 一般的,由于這兩種聲明方式的特性,現(xiàn)在項(xiàng)目組的開發(fā)規(guī)范中都會(huì)要求:不使用var而是let或const。 Const co...
JavaScript ES6 帶來了新的語法和新的強(qiáng)大功能,使您的代碼更現(xiàn)代,更易讀。它允許您編寫更少的代碼并執(zhí)行更多操作。 ES6 向我們介紹了許多強(qiáng)大的功能,如箭頭函數(shù),模板字符串,對(duì)象結(jié)構(gòu),模塊等,讓我們來看看。 const and let const 是 ES6 中用于聲明變量的新關(guān)鍵字。 const 比 var 更強(qiáng)大。使用后,無法重新分配變量。換句話說,它是一個(gè)不可變的變量,除非它與...
閱讀 3081·2021-11-24 11:14
閱讀 3525·2021-11-22 15:22
閱讀 3215·2021-09-27 13:36
閱讀 726·2021-08-31 14:29
閱讀 1335·2019-08-30 15:55
閱讀 1768·2019-08-29 17:29
閱讀 1153·2019-08-29 16:24
閱讀 2417·2019-08-26 13:48