ホームページ ウェブフロントエンド フロントエンドQ&A es6 の一時的なデッドゾーンとは何を意味しますか?

es6 の一時的なデッドゾーンとは何を意味しますか?

Jan 03, 2023 pm 03:56 PM
es6 一時的なデッドゾーン

es6 では、一時的なデッド ゾーンは構文エラーであり、ブロックを閉じたスコープにする let および const コマンドを指します。コード ブロック内では、let/const コマンドを使用して変数が宣言される前に、変数は使用できず、変数が宣言される前は変数の「デッド ゾーン」に属します。これは構文上「一時デッド ゾーン」と呼ばれます。 ES6 では、一時的なデッド ゾーンや let ステートメントや const ステートメントでは変数のプロモーションが発生しないことを規定しています。これは主に実行時エラーを軽減し、変数が宣言される前に使用されて予期せぬ動作が発生することを防ぐためです。

es6 の一時的なデッドゾーンとは何を意味しますか?

このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。

一時的なデッド ゾーンとは

#ES6 のコード ブロック内で、let/const コマンドを使用して変数を宣言する前、変数は使用できず、宣言される前は変数の「デッド ゾーン」に属しています。文法的には、これは「一時的なデッド ゾーン」(TDZ) と呼ばれます。 ES 標準では TDZ について明示的に言及していませんが、let と const の改善しない効果を説明するためによく使用されます。

let/const と var

ES6 より前は、JS スコープはグローバル スコープと関数スコープの 2 種類しかありませんでした。しかし、ES6 ではブロックレベルのスコープが登場しました。つまり、ブロックレベルのスコープは let/const を使用して定義できます。 ES6 の新機能の中で、TDZ の役割を確認する最も簡単な方法は、let/const を使用することです。 let/const と var には主に 2 つの違いがあります:

  • let/const はブロック スコープを使用します; var は関数スコープを使用します
  • let/const が宣言される前に対応する変数にアクセスする場合および定数の場合は、ReferenceError がスローされますが、var 宣言の前に対応する変数にアクセスすると、unknown が返されます
console.log(Vname); // undefined;
console.log(Lname); // ReferenceError
var Vname = 'xiaoxiao';
let Lname = 'xiaoxiao';
ログイン後にコピー

実践により、宣言前に var 定義を使用すると、 let's変数を使用する場合は未定義ですが、let's unknown変数を使用するとエラーがスローされます。 ES6 の let で宣言された変数には変数昇格の効果がないためです。

var x = 10;
if (true) {
    x = 20; // ReferenceError
    let x;
 }
ログイン後にコピー

ES6 では、ブロック内に let および const コマンドがある場合、このブロック内のこれらのコマンドによって宣言された変数は最初から閉じられたスコープを形成することを明確に規定しています。宣言前にこれらの変数を使用すると、エラーが発生します。 つまり、コード ブロック内では、let コマンドを使用して宣言されるまで変数は使用できません。文法的には、これは「一時的なデッド ゾーン」(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 を使用すると、指定された変数のデータ型を検出できることは誰もが知っています。値が定義されているかどうかを決定します。 unknown が返された場合、値が未定義であることを意味します。 ただし、typeof の宣言前に const/let で定義された変数を使用するとエラーが報告されます

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 ステートメントの使用のもう 1 つの違い。

// 不报错
var x = x;

// 报错
let x = x;
// ReferenceError: x is not defined
ログイン後にコピー

「デッド ゾーン」の影響を受け、let を使用して変数を宣言する場合、宣言が完了する前に変数が使用されている限り、エラーが報告されます。上の行はこの状況に属し、変数 x の宣言文が実行される前に x の値が取得されるため、「x が定義されていません」というエラーが発生します。

概要

ES6 では、主に実行時エラーを削減し、エラーを防ぐために、一時的なデッド ゾーンや let ステートメントや const ステートメントでは変数のプロモーションが発生しないと規定しています。変数を宣言する前に使用すると、予期しない動作が発生する可能性があります。このような間違いは ES5 ではよくあることですが、この規定が整備されたことで、それらを避けるのは簡単です。

つまり、一時的なデッド ゾーンの本質は、現在のスコープに入るとすぐに、使用したい変数がすでに存在するにもかかわらず、それを取得できないということです。変数を宣言するコード行が表示されるので、この変数を使用します。

注: TDZ はもともと const 用に設計されましたが、その後の let の設計にも一貫性がありました。

注: ES6 標準では、const に対して宣言された識別子は依然として定数変数と呼ばれる変数であることがよくあります。 const 宣言で作成された定数は JS では再代入できませんが、不変ではないため、両者の概念には依然として大きな違いがあります。

【関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

以上がes6 の一時的なデッドゾーンとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

非同期は es6 または es7 用ですか? 非同期は es6 または es7 用ですか? Jan 29, 2023 pm 05:36 PM

非同期はes7です。 async と await は ES7 に新しく追加されたもので、非同期操作のソリューションです。async/await は co モジュールとジェネレーター関数の糖衣構文と言え、より明確なセマンティクスで JS 非同期コードを解決します。名前が示すように、async は「非同期」を意味します。async は関数が非同期であることを宣言するために使用されます。async と await の間には厳密な規則があります。両方を互いに分離することはできず、await は async 関数内でのみ記述できます。

ES6 で配列を反転する方法 ES6 で配列を反転する方法 Oct 26, 2022 pm 06:19 PM

ES6 では、配列オブジェクトの reverse() メソッドを使用して、配列の反転を実現できます。このメソッドは、配列内の要素の順序を逆にして、最後の要素を最初に、最初の要素を最後に配置するために使用されます。構文「array」 。逆行する()"。 reverse() メソッドは元の配列を変更します。変更したくない場合は、拡張演算子 "..." とともに使用する必要があり、構文は "[...array].reverse() 」。

es6 の 2 つの配列で異なる項目を見つける方法 es6 の 2 つの配列で異なる項目を見つける方法 Nov 01, 2022 pm 06:07 PM

手順: 1. 構文 "newA=new Set(a); newB=new Set(b);" を使用して、2 つの配列をそれぞれセット型に変換します; 2. has() と filter() を使用して差分セットを検索します、構文 " new Set([...newA].filter(x =>!newB.has(x)))" では、差分セット要素がセット コレクションに含まれて返されます。 3. 配列を使用します。 from セットを配列に変換するタイプ、構文は「Array.from(collection)」です。

ミニ プログラムで es6 を es5 に変換する必要があるのはなぜですか? ミニ プログラムで es6 を es5 に変換する必要があるのはなぜですか? Nov 21, 2022 pm 06:15 PM

ブラウザの互換性のため。 ES6 は JS の新しい仕様として、多くの新しい構文と API を追加していますが、最新のブラウザーは ES6 の新機能を高度にサポートしていないため、ES6 コードを ES5 コードに変換する必要があります。 WeChat Web 開発者ツールでは、デフォルトで babel が使用され、開発者の ES6 構文コードを 3 つの端末すべてで適切にサポートされる ES5 コードに変換し、開発者がさまざまな環境によって引き起こされる開発上の問題を解決できるようにします。プロジェクト内でのみ設定して確認するだけです。 「ES6~ES5」オプション。

es5 および es6 で配列重複排除を実装する方法 es5 および es6 で配列重複排除を実装する方法 Jan 16, 2023 pm 05:09 PM

es5 では、for ステートメントと IndexOf() 関数を使用して配列の重複排除を実現できます。構文 "for(i=0;i<配列長;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}」。 es6 では、スプレッド演算子 Array.from() および Set を使用して重複を削除できます。まず配列を Set オブジェクトに変換して重複を削除してから、スプレッド演算子または Array.from() 関数を使用する必要があります。 Set オブジェクトを配列に変換してグループ化するだけです。

es6 の一時的なデッドゾーンとは何を意味しますか? es6 の一時的なデッドゾーンとは何を意味しますか? Jan 03, 2023 pm 03:56 PM

es6 では、一時的なデッド ゾーンは構文エラーであり、ブロックを閉じたスコープにする let および const コマンドを指します。コード ブロック内では、let/const コマンドを使用して変数が宣言される前に、変数は使用できず、変数が宣言される前は変数の「デッド ゾーン」に属します。これは構文上「一時デッド ゾーン」と呼ばれます。 ES6 では、一時的なデッド ゾーンや let ステートメントや const ステートメントでは変数のプロモーションが発生しないことを規定しています。これは主に実行時エラーを減らし、変数が宣言される前に使用されて予期しない動作が発生するのを防ぐためです。

es6 構文が必要ですか? es6 構文が必要ですか? Oct 21, 2022 pm 04:09 PM

いいえ、require は CommonJS 仕様のモジュール構文であり、es6 仕様のモジュール構文は import です。 require は実行時にロードされ、import はコンパイル時にロードされます。require はコード内のどこにでも記述できます。import はファイルの先頭にのみ記述でき、条件文や関数スコープでは使用できません。モジュール属性は導入されるだけです。 require を実行した場合、そのためパフォーマンスは比較的低くなりますが、インポート コンパイル中に導入されたモジュールのプロパティのパフォーマンスはわずかに高くなります。

es6 マップは注文されていますか? es6 マップは注文されていますか? Nov 03, 2022 pm 07:05 PM

地図は注文済みです。 ES6 のマップ タイプは、多くのキーと値のペアを格納する順序付きリストです。キー名と対応する値はすべてのデータ型をサポートします。キー名の等価性は、「Objext.is()」メソッドを呼び出すことによって決定されます。 , したがって、数字の 5 と文字列「5」は 2 つのタイプとして判断され、プログラム内で 2 つの独立したキーとして現れることができます。

See all articles