在es6中,暫時性死區是語法錯誤,是指let和const指令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
什麼是暫時性死區
#ES6中,在程式碼區塊內,使用let/const指令宣告變數之前,該變數都是不可用的,在變數宣告之前屬於該變數的「死區」。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 TDZ)。 ES標準並沒有明確提出TDZ,但我們常用其描述let、const的不提升效果。
let/const和var的區別
#在ES6之前,JS的scope只有兩種,全域作用域和函數作用域,但是在ES6種出現了區塊級作用域,也就是使用let/const可以定義區塊級作用域。 那麼在ES6的新特性中,最容易看到TDZ作用的就是使用let/const的使用上方。 let/const與var的主要不同有兩個地方:
- let/const是使用區塊作用域;var是使用函數作用域
- 在let/const宣告之前就訪問對應的變數與常數,會拋出ReferenceError錯誤;但在var聲明之前就訪問對應的變量,則會得到undefined
console.log(Vname); // undefined; console.log(Lname); // ReferenceError var Vname = 'xiaoxiao'; let Lname = 'xiaoxiao';
實踐證明當我們在未聲明之前使用var定義的變數時會得到undefined,但是在使用let未定義的變數時會拋出錯誤。因為ES6中的let宣告的變數是不存在變數提升的作用。
var x = 10; if (true) { x = 20; // ReferenceError let x; }
ES6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。 總之,在程式碼區塊內,使用let指令宣告變數之前,變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 TDZ)。
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
上面程式碼中,在let指令宣告變數tmp之前,都屬於變數tmp的「死區」。
typeof的「死區」陷阱
#我們都知道使用typeof 可以用來偵測給定變數的資料類型,也可以使用它來判斷值是否被定義。當傳回undefined時表示值未定義; 但是在const/let定義的變數在變數宣告之前如果使用了typeof就會報錯
typeof x; // ReferenceError let x;
因為x是使用let宣告的,那麼在x未宣告之前都屬於暫時性死區,在使用typeof時就會報錯。所以在使用let/const進行宣告的變數在使用typeof時不一定安全喔。
typeof y; // 'undefined'
但是可以看出,如果我們只是用了typeof而沒有去定義,也是不會報錯的,從這粒可以看出只要沒有明確規定使用const/let定義之前就是不會出錯。
傳參的「死區」陷阱
#例如下面一段程式碼,我們在使用
function bar(x = y, y = 2) { return [x, y]; } bar(); // 报错
#上程式碼中,呼叫bar函數之所以報錯(某些實作可能不報錯),是因為參數x預設值等於另一個參數y,而此時y還沒有聲明,屬於」死區「。如果y的預設值是x,就不會報錯,因為此時x已經宣告了。
function bar(x = 2, y = x) { return [x, y]; } bar(); // [2, 2]
使用var和let宣告的另一個差異。
// 不报错 var x = x; // 报错 let x = x; // ReferenceError: x is not defined
受「死區」的影響,使用let宣告變數時,只要變數在還沒有宣告完成前使用,就會報錯。上面這行就屬於這個情況,在變數x的宣告語句還沒執行完成前,就去取x的值,導致報錯」x 未定義「。
總結
ES6 規定暫時性死區和let、const語句不出現變數提升,主要是為了減少執行階段錯誤,防止在變數宣告前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的,現在有了這種規定,避免這類錯誤就很容易了。
總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到聲明變數的那一行程式碼出現,才可以取得和使用該變數。
註: TDZ最一開始是為了const所設計的,但後來的對let的設計也是一致的。
註: 在ES6標準中,對於const所宣告的識別子仍然也常為variable(變數),稱為constant variable(固定的變數)。以const宣告所創造出來的常數,在JS中只是不能再被賦(can't re-assignment),並不是不可被改變(immutable)的,這兩個概念仍然有很大的差異。
【相關推薦:javascript影片教學、web前端】
以上是es6暫時性死區是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

在es6中,暂时性死区是一个语法错误,是指let和const命令使区块形成封闭的作用域。在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的“死区”;这在语法上,称为“暂时性死区”。ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境