摘要:聲明的變量只在其所在的代碼塊內(nèi)有效。只要在聲明之前使用這些變量,就會報錯。在語法上稱為暫時性死區(qū)有時候,會不經(jīng)間遇到比較隱蔽的死區(qū),不太容易被發(fā)現(xiàn)。不允許重復聲明不允許在相同的作用域內(nèi)聲明同一個變量。一旦聲明,其值就不能再改變。
let && const let let聲明的變量只在其所在的代碼塊內(nèi)有效。
{ let a = 10; } console.log(a) //ReferenceError:a is not definedlet聲明變量不存在變量提升
let不像var那樣會發(fā)生“變量提升”現(xiàn)象,所以,變量一定要在聲明后使用,不然就會報錯。
console.log(a) //ReferenceError:a is not defined let a = 10;暫時性死區(qū)
只要塊級作用域內(nèi)存在let關鍵字,它所聲明的變量就綁定這個區(qū)域,不再受外部影響。
var tmp = 20; if(true){ tmp = "abc"; //ReferenceError:tmp is not defined let tmp; }
上面的代碼中存在全局變量tmp,但是塊級作用域內(nèi)let又聲明了一個局部變量tmp,導致后者綁定了這個塊級作用域,所以在let聲明變量前,對tmp賦值會報錯。
ES6明確規(guī)定,如果區(qū)塊中存在let和const命令,則這個區(qū)塊對這些命令聲明的變量從一開始就形成封閉作用域。只要在聲明之前使用這些變量,就會報錯。在語法上稱為“暫時性死區(qū)(temporal dead zone,TDZ)”
有時候,會不經(jīng)間遇到比較隱蔽的“死區(qū)”,不太容易被發(fā)現(xiàn)。
function bar(x=y,y=2){ return [x,y]; } bar() //報錯
上面的代碼中是因為參數(shù)x的默認值等于另一個參數(shù)y,而此時y還沒有聲明,屬于死區(qū)。
不允許重復聲明let不允許在相同的作用域內(nèi)聲明同一個變量。
function bar(){ let a = 10; var a = 20; } //報錯 function bat(){ let a = 10; let a = 20; } //報錯
因此,所以也不能在函數(shù)內(nèi)重復聲明參數(shù):
function bar(args){ let args = 10; } bar() //報錯 function bar(args){ { let args = 20; } } bar() //不報錯塊級作用域
外層代碼塊不受內(nèi)層代碼塊的影響。
外層作用域無法讀取內(nèi)層作用域的變量。
內(nèi)層作用域可以定義外層作用域的同名變量。
塊級作用域的實現(xiàn),使得廣泛使用的自執(zhí)行匿名函數(shù)(IIFE)變得不再必要了。
//自執(zhí)行模式 (function(){ var a = 10; })() //塊級作用域?qū)懛?function(){ let a = 10; }
函數(shù)本身的作用域也在其所在的塊級作用域之內(nèi)。
constconst用來聲明常量。一旦聲明,其值就不能再改變。
const PI = 3.1415; const PI = 3 //TypeErrorL "PI" is read-only
const聲明的變量不得改變值,意味著const一旦聲明常量就必須立即初始化,不能留到后面賦值。
const與let關鍵字一樣,只在聲明所在的塊級作用域內(nèi)有效;const關鍵字聲明的常量也不提升,同樣存在暫時性死區(qū),只能在聲明后使用。
對于復合型數(shù)據(jù)類型,常量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const關鍵字只是保證常量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變,所以將一個對象聲明為常量必須注意該點。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78624.html
摘要:理解元編程和是屬于元編程范疇的,能介入的對象底層操作進行的過程中,并加以影響。元編程中的元的概念可以理解為程序本身。中,便是兩個可以用來進行元編程的特性。在之后,標準引入了,從而提供比較完善的元編程能力。 導讀 幾年前 ES6 剛出來的時候接觸過 元編程(Metaprogramming)的概念,不過當時還沒有深究。今天在應用和學習中不斷接觸到這概念,比如 mobx 5 中就用到了 Pr...
摘要:的出現(xiàn),使用內(nèi)建對象的繼承得以實現(xiàn)。屬性不存在拋出異常是取值操作,而就是賦值操作,可以對屬性值進行驗證。屬性必須為數(shù)字拋出異常接受兩個參數(shù)被讀取屬性的原對象,即代理的目標。這個可以攔截內(nèi)部方法,通過返回數(shù)組的值可以覆寫其行為。 Proxy & Reflect extends的出現(xiàn),使用內(nèi)建對象的繼承得以實現(xiàn)。Proxy可以攔截JS引擎內(nèi)部目標的底層對象操作,這些底層操作被攔截后會觸發(fā)響...
let和const let和const兩者并不存在變量提升 這里要說明的是變量一定要在聲明后使用,否則報錯。 vara=[]; for(vari=0;i<10;i++){ a[i]=function(){ console.log(i); }; } a[6]();//10 變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的...
摘要:更好的語義和分別表示異步和等待,比起和更容易理解。前邊聲明關鍵字,表示內(nèi)部有內(nèi)部操作,調(diào)用函數(shù)會返回一個對象。等價于其中函數(shù)就是自動執(zhí)行器。 async函數(shù) 定義 async函數(shù)其實就是之前說過的Generator的語法糖,用于實現(xiàn)異步操作。它是ES2017的新標準。 讀取兩個文件: const fs = require(fs) const readFile = function(f...
摘要:副作用,無副作用可執(zhí)行和關鍵詞。和不能像一樣同一個下聲明多次和不會像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 關鍵詞: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...
閱讀 2645·2021-10-12 10:12
閱讀 790·2019-08-29 17:25
閱讀 2792·2019-08-29 17:24
閱讀 3226·2019-08-29 17:19
閱讀 1806·2019-08-29 15:39
閱讀 3053·2019-08-26 16:50
閱讀 1997·2019-08-26 12:17
閱讀 2703·2019-08-26 12:16