検索

ES6でのletの使い方

Jan 12, 2023 pm 07:10 PM
es6let

es6 では、let キーワードを使用して変数を宣言しますが、宣言された変数は let コマンドが配置されているコード ブロック内でのみ有効です。 Let は「変数の昇格」を引き起こさないため、変数は宣言後に使用する必要があります。そうしないと、エラーが報告されます。 let コマンドがブロックレベルのスコープに存在する限り、それによって宣言された変数はこの領域に「バインド」され、外部の影響を受けなくなります。

ES6でのletの使い方

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

es6 let キーワード

ES6 は、変数を宣言するための新しい let コマンドを追加します。使用方法は var と似ていますが、宣言された変数は let コマンドが配置されているコード ブロック内でのみ有効です。

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1

上記のコードはコード ブロック内にあり、それぞれ letvar を持つ 2 つの変数を宣言します。次に、これら 2 つの変数がコード ブロックの外で呼び出され、その結果、let で宣言された変数はエラーを報告し、var で宣言された変数は正しい値を返します。これは、let によって宣言された変数が、それが配置されているコード ブロック内でのみ有効であることを示しています。

forループのカウンターは、let コマンドの使用に非常に適しています。

for (let i = 0; i < 10; i++) {}

console.log(i);
//ReferenceError: i is not defined

上記のコードでは、カウンター ifor ループの本体内でのみ有効であり、ループの外で参照されるとエラーが報告されます。

次のコードで var を使用する場合、最終出力は 10 になります。

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

上記のコードでは、変数 ivar によって宣言されており、グローバル スコープで有効です。したがって、ループするたびに、新しい i 値が古い値を上書きし、最終出力は i の最後のラウンドの値になります。

let が使用される場合、宣言された変数はブロックレベルのスコープ内でのみ有効であり、最終出力は 6 になります。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

上記のコードでは、変数 ilet によって宣言されています。現在の i はこのサイクルでのみ有効であるため、サイクル i は実際には新しい変数であるため、最終出力は 6 になります。

変数昇格なし

letvar のような「変数昇格」現象はありません。したがって、変数は宣言後に使用する必要があります。そうしないと、エラーが報告されます。

console.log(foo); // 输出undefined
console.log(bar); // 报错ReferenceError

var foo = 2;
let bar = 2;

上記のコードでは、変数 foovar コマンドで宣言されており、変数の昇格が発生します。つまり、スクリプトの実行が開始されると、変数 foo は存在しますが、値がないため、unknown が出力されます。変数 barlet コマンドで宣言されており、変数の昇格は行われません。これは、変数 bar が宣言前には存在しないことを意味し、使用するとエラーがスローされます。

一時的なデッドゾーン

letコマンドがブロックレベルのスコープ内に存在する限り、それによって宣言された変数は「バインド」されます。この領域は外部からの影響を受けなくなります。

var tmp = 123;

if (true) {
  tmp = &#39;abc&#39;; // ReferenceError
  let tmp;
}

上記のコードには、グローバル変数 tmp がありますが、let はブロックレベルのスコープでローカル変数 tmp を宣言しています。結果は次のようになります。 Or binding this block-levelscope. そのため、let が変数を宣言する前に、値を tmp に代入するとエラーが報告されます。

ES6 では、ブロック内に let および const コマンドがある場合、このブロックは最初からこれらのコマンドによって宣言された変数に対してクローズド効果を持つことを明確に規定しています。 。 エリア。宣言前にこれらの変数を使用すると、エラーが発生します。

つまり、コード ブロック内では、let コマンドを使用して宣言されるまで変数は使用できません。文法的には、これは「一時的なデッド ゾーン」(TDZ) と呼ばれます。

if (true) {
  // TDZ开始
  tmp = &#39;abc&#39;; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

上記のコードでは、let コマンドが変数 tmp を宣言する前に、変数 tmp## の「デッド ゾーン」に属しています。 #。

「一時的なデッド ゾーン」は、

typeof が 100% 安全な操作ではなくなったことも意味します。

typeof x; // ReferenceError
let x;

上記のコードでは、変数

xlet コマンドを使用して宣言されているため、宣言される前は ## の「デッド ゾーン」に属しています。 #x. を使用している限り、この変数に到達するとエラーが報告されます。したがって、typeof は実行時に ReferenceError をスローします。 比較のために、変数がまったく宣言されていない場合、

typeof

を使用してもエラーは報告されません。 <pre class="brush:php;toolbar:false">typeof undeclared_variable // &quot;undefined&quot;</pre>上記のコードでは、

undeclared_variable

は存在しない変数名であり、結果は「未定義」になります。したがって、let より前は、typeof 演算子は 100% 安全であり、エラーを報告することはありませんでした。これはもはや真実ではありません。この設計は、誰もが良いプログラミング習慣を身につけられるようにすることを目的としています。変数は宣言した後に使用する必要があります。使用しないと、エラーが報告されます。 一部の「デッド ゾーン」は隠されており、見つけるのが簡単ではありません。

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]

ES6规定暂时性死区和letconst语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。

总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

// 报错
function () {
  let a = 10;
  var a = 1;
}

// 报错
function () {
  let a = 10;
  let a = 1;
}

因此,不能在函数内部重新声明参数。

function func(arg) {
  let arg; // 报错
}

function func(arg) {
  {
    let arg; // 不报错
  }
}

块级作用域

为什么需要块级作用域?

ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。

第一种场景,内层变量可能会覆盖外层变量。

var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = "hello world";
  }
}

f(); // undefined

上面代码中,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。

第二种场景,用来计数的循环变量泄露为全局变量。

var s = &#39;hello&#39;;

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5

上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。

ES6的块级作用域

let实际上为JavaScript新增了块级作用域。

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

上面的函数有两个代码块,都声明了变量n,运行后输出5。这表示外层代码块不受内层代码块的影响。如果使用var定义变量n,最后输出的值就是10。

ES6允许块级作用域的任意嵌套。

{{{{{let insane = &#39;Hello World&#39;}}}}};

上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。

{{{{
  {let insane = &#39;Hello World&#39;}
  console.log(insane); // 报错
}}}};

内层作用域可以定义外层作用域的同名变量。

{{{{
  let insane = &#39;Hello World&#39;;
  {let insane = &#39;Hello World&#39;}
}}}};

块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。

// IIFE 写法
(function () {
  var tmp = ...;
  ...
}());

// 块级作用域写法
{
  let tmp = ...;
  ...
}

【相关推荐:javascript视频教程编程视频

以上がES6でのletの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
useState()vs。usereducer():州のニーズに合った適切なフックを選択するuseState()vs。usereducer():州のニーズに合った適切なフックを選択するApr 24, 2025 pm 05:13 PM

ChooseuseState()forsimple,independentstatevariables;useuseReducer()forcomplexstatelogicorwhenstatedependsonpreviousstate.1)useState()isidealforsimpleupdatesliketogglingabooleanorupdatingacounter.2)useReducer()isbetterformanagingmultiplesub-valuesorac

UseState()を使用して状態を管理する:実用的なチュートリアルUseState()を使用して状態を管理する:実用的なチュートリアルApr 24, 2025 pm 05:05 PM

UseStateは、州の管理を簡素化し、コードをより明確にし、読みやすくし、Reactの宣言的な性質と一致するため、クラスコンポーネントやその他の州管理ソリューションよりも優れています。 1)UseStateを使用すると、状態変数を関数コンポーネントに直接宣言することができます。2)フックメカニズムの再レンダリング中に状態を覚えています。

UseState()を使用する時期と、代替の州管理ソリューションを検討するタイミングUseState()を使用する時期と、代替の州管理ソリューションを検討するタイミングApr 24, 2025 pm 04:49 PM

useUsestate()forlocalcomponentStatemanagement; compleartinative forglogic、orperformanceissues.1)useidealforsimple、localstate.2)useglobalStateSolutionSolutionSuxorContextForSharedState.3)OptForreDuxtormobxobxobxobforexSt

Reactの再利用可能なコンポーネント:コードの維持可能性と効率の向上Reactの再利用可能なコンポーネント:コードの維持可能性と効率の向上Apr 24, 2025 pm 04:45 PM

再利用することは、codecodemaintainabilityを抑制することを再生します

Virtual Dom in React:効率的な更新によるパフォーマンスの向上Virtual Dom in React:効率的な更新によるパフォーマンスの向上Apr 24, 2025 pm 04:41 PM

virtualdomisalightweightin-memorycopyofthedomused byRealctuttooptimizeuiupdates.itboostsperformanceByminimizingddomizeddomizedirectdomizedirectdomizedirectdomizedirculation fupdatingthatingdatingdatualdomfirst、その後、applyingonlynlynalychangestotualdom。

HTMLとReactの統合:実用的なガイドHTMLとReactの統合:実用的なガイドApr 21, 2025 am 12:16 AM

HTMLとReactは、JSXを介してシームレスに統合して、効率的なユーザーインターフェイスを構築できます。 1)JSXを使用してHTML要素を埋め込み、2)仮想DOMを使用してレンダリングパフォーマンスを最適化し、3)コンポーネントを通じてHTML構造を管理およびレンダリングします。この統合方法は直感的であるだけでなく、アプリケーションのパフォーマンスを向上させます。

ReactおよびHTML:レンダリングデータと取り扱いイベントReactおよびHTML:レンダリングデータと取り扱いイベントApr 20, 2025 am 12:21 AM

React Reactは、状態および小道具を介してデータを効率的にレンダリングし、合成イベントシステムを介してユーザーイベントを処理します。 1)Counterの例など、UseStateを使用して状態を管理します。 2)イベント処理は、ボタンクリックなどのJSXに関数を追加することにより実装されます。 3)トドリストコンポーネントなどのリストをレンダリングするには、重要な属性が必要です。 4)フォーム処理の場合、FormコンポーネントなどのuseStateおよびe.preventdefault()。

バックエンド接続:Reactがサーバーとどのように相互作用するかバックエンド接続:Reactがサーバーとどのように相互作用するかApr 20, 2025 am 12:19 AM

Reactは、HTTP要求を介してサーバーと対話し、データを取得、送信、更新、削除します。 1)ユーザー操作はイベントをトリガーします。2)HTTP要求を開始する、3)サーバーの応答をプロセス、4)コンポーネントのステータスと再レンダリングを更新します。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません