搜尋
首頁web前端前端問答es6暫時性死區是什麼意思
es6暫時性死區是什麼意思Jan 03, 2023 pm 03:56 PM
es6暫時性死區

在es6中,暫時性死區是語法錯誤,是指let和const指令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。

es6暫時性死區是什麼意思

本教學操作環境: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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
es6怎么判断是否为数组es6怎么判断是否为数组Apr 25, 2022 pm 06:43 PM

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

es6中遍历跟迭代的区别是什么es6中遍历跟迭代的区别是什么Apr 26, 2022 pm 02:57 PM

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

es6暂时性死区是什么意思es6暂时性死区是什么意思Jan 03, 2023 pm 03:56 PM

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

es6中怎么判断两个对象是否相等es6中怎么判断两个对象是否相等Apr 19, 2022 pm 03:34 PM

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

es6怎么将数字转为字符串es6怎么将数字转为字符串Apr 19, 2022 pm 06:38 PM

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

sort排序是es6中的吗sort排序是es6中的吗Apr 25, 2022 pm 03:30 PM

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

es6中assign的用法是什么es6中assign的用法是什么May 05, 2022 pm 02:25 PM

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

es6怎么改变数组数据es6怎么改变数组数据Apr 26, 2022 am 10:08 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

SublimeText3 英文版

SublimeText3 英文版

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

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境