「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript でのホイスティング

JavaScript でのホイスティング

2024 年 11 月 6 日に公開
ブラウズ:886

Hoisting in JavaScript

JavaScript のホイスティングとは何ですか?

ホイスティングとは、実行前に宣言が行われる JavaScript のプロセスを指します。変数と関数の宣言が最初に処理されます。その結果、宣言前に変数が参照されてもエラーにはならず、unknown が返されます。関数宣言の場合、関数全体がホイストされます。これは、コードで定義される前に関数を使用できることを意味します。このプロセスでは、実行が開始される前に宣言がスタックに配置されます。

より簡単に言うと:

  • var で宣言された変数は、ホイスティング中に未定義として初期化されます。

  • 関数宣言は完全にホイストされており、コードに書き込む前に呼び出すことができます。

  • ホイスト プロセスにより、コード内の位置に関係なく、これらの宣言が実行スタック内で確実に認識されます。

宣言のみがホイストされ、割り当てはホイストされないことに注意することが重要です。割り当ては、作成した場所と同じ場所に残ります。

注: ホイスティング中にコードが上部に移動すると言っている人は実際には間違っています。コードは上に移動することはありません。

例:

console.log(myVariable); // undefined      
var myVariable = 10;

このコードは 2 つのアクションを同時に実行します。まず、変数 myVariable を宣言し、それをスコープにホイストしますが、その値はまだ未定義です。そのため、console.log コマンドでは、初期化されていない値が未定義として表示されます。その後、値 10 が myVariable.

に割り当てられます。

ただし、変更しても以前の宣言には影響しません。例えば:

console.log(myVariable); // ReferenceError: myVariable is not defined      
myVariable = 10;

ここでは、myVariable 変数を宣言していないため、変数を変更しようとする前に ReferenceError がスローされます。

要約すると、JavaScript は最初にすべてのコードを読み取り、次に割り当てを元の位置に保持したまま、すべての宣言を out に巻き上げます。このプロセスはホイスティングとして知られています。

var と let もホイストされます。

var と let は両方とも JavaScript でホイストされますが、動作は若干異なります。

変数:

var を使用して変数を宣言すると、その宣言はスコープ外にホイストされ、宣言前から変数にアクセスできますが、値が割り当てられるまで値は未定義になります。

例:

console.log(myVariable); // undefined
var myVariable = 10;

上記のコードでは、宣言 var myVariable がスコープ外にホイストされていますが、割り当て myVariable = 10 はそのまま残されています。したがって、変数は存在しますが値がまだ割り当てられていないため、console.log ステートメントは unknown を出力します。

させて:

一方、let を使用して変数を宣言する場合、ホイスティングの動作は少し異なります。変数宣言はホイストされますが、宣言前に変数にアクセスすることはできません。これは「時間的デッドゾーン」として知られています。 let 変数を宣言する前にアクセスしようとすると、ReferenceError.

が発生します。

例:

console.log(myVariable); // ReferenceError: myVariable is not defined
let myVariable = 10;

この場合、宣言はホイストされますが、宣言の前に変数にアクセスすることはできません。したがって、変数がまだ定義されていないため、console.logstatement は ReferenceError をスローします。

ここで基本的にletの場合、巻き上げても変数の値は未定義のままです。メモリ内にその変数を格納できるスペースがないためです。このため、そのアドレスを参照できません。 myVariable = 10のアドレスがメモリ上にないため参照エラーとなります。

定数:

const キーワードを使用すると、定数を作成できます。定数は、値が割り当てられると再割り当てできない変数です。

例:1

const PI = 3.142;
PI = 22/7; // Attempt to reassign the value of PI
console.log(PI); // Output: TypeError: Assignment to constant variable

この例では、PI it を初期値 3.142 の定数として定義します。新しい値を PI に再割り当てしようとすると、定数を再割り当てできないため、TypeError がスローされます。

例:2

const PI;
console.log(PI); // Output: SyntaxError: Missing initializer in const declaration
PI = 3.142;

この場合、定数 PI を初期化せずに宣言します。定数の宣言と初期化を同時に行う必要があるため、このコードは SyntaxError をスローします。

例:3

function getCircumference(radius) {
  console.log(circumference);
  circumference = PI * radius * 2;
  const PI = 22/7;
}
getCircumference(2); // ReferenceError: circumference is not defined

ここでは、getCircumference 関数内で、宣言前にその周囲にアクセスしようとします。変数がまだ定義されていないため、ReferenceError がスローされます。

constを使用する場合は変数を宣言して初期化してから使用する必要があります。

全体として、var と let はどちらも JavaScript でホイストされますが、それらの動作と時間的デッド ゾーンの概念は let 変数にのみ適用されます。 const は、一度初期化すると再割り当てできない定数を作成します。

宣言されていない変数はすべてグローバル変数です。

function hoisted() {
a = 20;
var b = 100;
}
hoisted();
console.log(a); // 20
// can be accessed as a global variable outside the hoisted() function.

console.log(b);
// As it is declared, it is bound within the bounds of the hoisted() function. We cannot print it outside the hoisted() function.
output: ReferenceError: b is not defined

関数スコープ変数

関数 hoist() のスコープ内の var message 変数の宣言が関数の先頭に移動していることがわかります。
この問題を回避するために、変数を使用する前に必ず宣言するようにします。

あなたが提供した両方の例では、出力は未定義になります。

例:1

function hoist() {
  console.log(message);
  var message = 'Hoisting is all the rage!';
}
hoist(); // Output: undefined

例:2

function hoist() {
  var message;
  console.log(message);
  message = 'Hoisting is all the rage!';
}

hoist(); // Output: undefined

どちらの場合も、変数はそれぞれのスコープの先頭にホイストされますが、その後、コードの元の順序で割り当てが行われるため、出力は未定義です。

関数式

関数式はホイストされず、式が関数ではなく変数として扱われるため、TypeError がスローされます。

expression(); // Output: "TypeError: expression is not a function
var expression = function() {
  console.log('Will this work?');
};

ストリクトモード

その名前からわかるように、これは、宣言される前の変数の使用を許容しない、制限された JavaScript の亜種です。厳密モードでコードを実行する:

  • 一部のサイレント JavaScript エラーを明示的なスロー エラーに変更することで排除します。

  • JavaScript エンジンによる最適化の実行を困難にする間違いを修正します。

  • 変数の宣言を見逃している可能性があります。strict を使用すると、参照エラーが発生して停止します。

'use strict';

console.log(hoist); // Output: ReferenceError: hoist is not defined
hoist = 'Hoisted';

結論

変数や関数を宣言するときは、JavaScript でホイスティングを理解することが重要です。ホイスティングについて説明すると、JavaScript コードが実際にどのように処理されるかを理解できるようになります。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/nozibul_islam_113b1d5334f/hoisting-in-javascript-i3p?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Go で HTTP POST リクエストの進行状況を追跡する方法は?
    Go で HTTP POST リクエストの進行状況を追跡する方法は?
    Go での HTTP POST リクエストの進行状況の追跡POST リクエスト経由で大きなファイルや画像を送信する場合、開発者はアップロードの進行状況を追跡する際に課題に直面することがよくあります。 。この質問では、Go アプリケーションでそのようなリクエストの進行状況を監視するための信頼できる方法...
    プログラミング 2024 年 11 月 6 日に公開
  • Java でフォルダーからファイル名のリストを取得するにはどうすればよいですか?
    Java でフォルダーからファイル名のリストを取得するにはどうすればよいですか?
    Java を使用してフォルダー内のファイル名を取得するディレクトリ内のファイル名のリストを取得するタスクは、さまざまな環境で共通の要件です。プログラミングシナリオ。 Java でこれを実現するには、File クラスを利用する簡単なアプローチがあります。コード アプローチ:まず、目的のディレクトリ パ...
    プログラミング 2024 年 11 月 6 日に公開
  • Angular Pipes: 包括的なガイド
    Angular Pipes: 包括的なガイド
    Angular の Pipes は、基になるデータを変更せずにテンプレート内のデータを変換するために使用される単純な関数です。パイプは値を受け取り、それを処理し、フォーマットされた出力または変換された出力を返します。これらは、日付、数値、文字列、さらには配列やオブジェクトの書式設定によく使用されます...
    プログラミング 2024 年 11 月 6 日に公開
  • Tailwind CSS とダークモード
    Tailwind CSS とダークモード
    この記事では、Tailwind CSS で ダーク モードを実装する方法を検討します。ダーク モードは、暗い環境でも優れたユーザー エクスペリエンスを提供し、目の疲れを軽減するため、人気のデザイン トレンドになっています。 Tailwind では、組み込みユーティリティを使用してダーク モードを簡単...
    プログラミング 2024 年 11 月 6 日に公開
  • CakePHP の Find メソッドを使用して JOIN クエリを実行するにはどうすればよいですか?
    CakePHP の Find メソッドを使用して JOIN クエリを実行するにはどうすればよいですか?
    JOIN を使用した CakePHP の Find メソッドCakePHP の find メソッドは、テーブルの結合など、データベースからデータを取得する強力な方法を提供します。この記事では、CakePHP の find メソッドを使用して JOIN クエリを実行する 2 つの方法を説明します。方法...
    プログラミング 2024 年 11 月 6 日に公開
  • 結果を再計算したり保存したりせずに、Python でジェネレーターを再利用するにはどうすればよいですか?
    結果を再計算したり保存したりせずに、Python でジェネレーターを再利用するにはどうすればよいですか?
    リセットによる Python でのジェネレーターの再利用Python では、ジェネレーターは要素のシーケンスを反復処理するための強力なツールです。ただし、反復が開始されると、ジェネレーターを巻き戻すことはできません。ジェネレーターを複数回再利用する必要がある場合、これが問題になる可能性があります。ジ...
    プログラミング 2024 年 11 月 6 日に公開
  • JavaScript 開発者向けのトップ S コード拡張機能
    JavaScript 開発者向けのトップ S コード拡張機能
    JavaScript は急速に進化しており、JavaScript を取り巻くツールのエコシステムも急速に進化しています。 開発者は、ワークフローをできるだけ効率的かつスムーズにしたいと考えています。そこで Visual Studio Code (VS Code) が登場します。 JavaScript...
    プログラミング 2024 年 11 月 6 日に公開
  • 計算結果を表示するための HTML 出力タグの使用方法。
    計算結果を表示するための HTML 出力タグの使用方法。
    おかえり!みんなが週末を楽しんだことを願っています。今日は、HTML タグに戻り、 タグに焦点を当てましょう。 タグとは何ですか? タグは計算結果を表示するために使用します。これはインライン要素であり、、、またはその他のインライン要素内に配置できます。これは、計算の結果を表示したり、...
    プログラミング 2024 年 11 月 6 日に公開
  • Java : 変数、データ型、入出力について理解する
    Java : 変数、データ型、入出力について理解する
    導入: Java は世界で最も人気があり多用途なプログラミング言語の 1 つで、Web アプリケーションからモバイル アプリケーションまであらゆるものに使用されています。 Java への取り組みを開始する場合は、基本を理解することが不可欠です。このガイドでは、Java プログラムの...
    プログラミング 2024 年 11 月 6 日に公開
  • 高さに基づいて Div のアスペクト比を維持するにはどうすればよいですか?
    高さに基づいて Div のアスペクト比を維持するにはどうすればよいですか?
    高さに基づいて Div のアスペクト比を維持するWeb デザインでは、要素のアスペクト比を制御することがレスポンシブ レイアウトにとって重要です。この質問では、div の幅をその高さのパーセンテージとして維持し、高さが変化しても要素の形状が一貫していることを保証する方法を検討します。従来のアプローチ...
    プログラミング 2024 年 11 月 6 日に公開
  • Flet での DatePicker の処理
    Flet での DatePicker の処理
    DatePicker の実装をリクエストするためのプロジェクトです。 Flet の公式ドキュメントを参照してください。 import datetime import flet as ft def main(page: ft.Page): page.horizontal_alignment =...
    プログラミング 2024 年 11 月 6 日に公開
  • 円形の SVG マスクに合わせて画像のサイズを変更するにはどうすればよいですか?
    円形の SVG マスクに合わせて画像のサイズを変更するにはどうすればよいですか?
    円形の SVG パスに合わせて画像のサイズを変更するSVG パスを使用して画像から円形の部分を切り取る場合、次のことが重要です。適切な位置合わせを確保するために。画像がうまくフィットしない場合は、SVG マスクのサイズまたは位置が間違っていることが原因である可能性があります。望ましい結果を達成するた...
    プログラミング 2024 年 11 月 6 日に公開
  • 技術面接の質問 - パート タイプスクリプト
    技術面接の質問 - パート タイプスクリプト
    Introduction Hello, hello!! :D Hope you’re all doing well! How we’re really feeling: I’m back with the second part of this series. ? In this...
    プログラミング 2024 年 11 月 6 日に公開
  • Laravel Eloquentで一意の「seller_id」ごとに最大の「created_at」を持つ行を選択する方法は?
    Laravel Eloquentで一意の「seller_id」ごとに最大の「created_at」を持つ行を選択する方法は?
    Laravel Eloquent: 最大値を持つ行を選択する Created_atLaravel Eloquent では、最大値を持つすべての行を選択する必要があるシナリオが発生する場合があります。テーブル内の一意の各eller_id の created_at 値。これを実現する方法は次のとおりです...
    プログラミング 2024 年 11 月 6 日に公開
  • ReactJS での遅延読み込み: 開発者ガイド
    ReactJS での遅延読み込み: 開発者ガイド
    遅延読み込みは ReactJS の強力なテクニックで、必要なときにのみコンポーネントや要素を読み込むことができ、Web アプリケーションのパフォーマンスを向上させます。この記事では、遅延読み込みの概念とその利点、そして組み込みの React.lazy() と React.Suspense を使用して...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3