JavaScript における識別子のプロモーションの問題_javascript のヒント
JS には変数プロモーションがあります。この設計は実際には不十分、または言語実装の副作用です。これにより、変数を宣言せずにアクセスしたり、後で宣言して最初に使用したりすることができます。初心者はこれに混乱し、長年 JS を使用してきた多くのベテランさえも混乱します。しかし、ES6 が let/const を追加した後、変数 Hoisting は存在しなくなりました。
1. 変数は宣言されていないため、直接使用します
function test() { alert(notDefined); } test(); // ?
エラーを報告するのは当然です
2. 最後に変数宣言
function test() { alert(declaredButNotAssigned); // undefined var declaredButNotAssigned; } test();
出力は未定義です。結果は上記の例と比較して改善されており、エラーは報告されず、コードは実行できますが、変数値はプログラマが期待したものではない可能性があります。
3. 最後に変数を宣言し、同時に変数に値を代入します
function test() { alert(declaredAndAssigned); // undefined var declaredAndAssigned = 1; } test();
結果は 2 と同じですが、代入しただけでは 1 が出力されるわけではありません。
2 と 3 は両方とも、単純に定義された変数ホイスティング (ホイスティング) を持っています
変数の昇格: 指定されたスコープでは、コード順序に関して、変数は最初に使用され、次に宣言されますが、実行時の変数の「アクセス可能性」は現在のスコープの先頭に昇格され、その値は未定義です、そして「可用性」はありません。
ここで重点を置くのは「コードの順序」と「実行順序」です。これは、ほとんどの場合、作成したコードは順番に実行されるため、つまり、「コードの順序」と「実行順序」が一貫しているためです。これは人間の脳の思考プロセスとも一致します。例:C言語の経験のあるプログラマー
#include <stdio.h> int main() { int x = 1; printf("%d, ", x); // 1 }
2 行のコードで、最初に整数型 x を宣言してから、それを出力します。コードシーケンスと実行シーケンスは一貫しています。つまり、正常に動作します。
順序が逆の場合
#include <stdio.h> int main() { printf("%d, ", x); // error int x = 1; }
この時点では、コンパイルを通過できません。ただし、JS では逆に記述することもできます。2 と 3 を参照してください。
したがって、C 系言語の経験のあるプログラマーは、変数を最初に宣言してから使用する必要があることを知っています。そうしないと、エラーが報告されます。 JS では、変数のプロモーションという現象があり、これを最初に使用してから宣言することができ、C の経験が JS で使用され、混乱が生じます。
4. 関数式にも変数プロモーションがあります
function test() { alert(func); // undefined var func = function() {}; } test();
しかし、この関数を使用したい場合は、それは不可能です
function test() { alert(func); // undefined func(); // 报异常 var func = function() {}; } test();
結果の func は未定義であり、func を呼び出すと例外が報告されます。 アクセシビリティと可用性は上記の定義で言及されており、次の記述に対応します。
アクセシビリティ:alert(func)、出力は未定義、実行可能、func にアクセス可能。
可用性: func() は例外を報告し、func は正常に呼び出すことができず、可用性がないことを示します。
2番目、3番目、4番目はすべてvarを使用して宣言された変数です。JSの関数宣言も改良されますが、この「変数」は関数型です(関数、メソッド、またはコンストラクタとして使用できます)。 。その名前 (識別子) も現在のスコープの先頭に引き上げられます。
5. 関数宣言の名前も現在のスコープの先頭に昇格されます
function test() { alert(f1); // function f1(); // "called" function f1() { alert('called'); } } test();
f1 がコードの最後で宣言され、f1 が最初に使用されることがわかります。alert(f1) と f1() の両方が正常に実行され、アクセシビリティと使いやすさの両方が存在することがわかります。
前に述べたように、変数の巻き上げは役に立ちません。「最初に宣言してから使用する」のが良い習慣です。この機能は大企業の面接の質問にも多く登場します
質問 1:
// 写出以下代码的运行结果 var a = 1; function fn() { if (!a) { var a = 2; } alert(a); // ? } fn();
質問 2:
// 写出以下代码的运行结果 var a = 1; function fn() { a = 2; return; function a() {} } fn(); alert(a); // ?
しかし、これは ES6 の let/const の登場ですべて終わりました。グローバル変数を除いて、ES の他のすべてのものは let/const を使用します。var を let に置き換えた後は、変数の昇格は存在しません。
function test() { alert(declaredButNotAssigned1); // 报异常 alert(declaredButNotAssigned2); // 报异常 alert(func); // 报异常 let declaredButNotAssigned1; let declaredButNotAssigned2 = true; let func = function() {}; } test();
これにより、プログラマは変数を「最初に宣言してから使用する」という良い習慣を身につけなければなりません。そうしないと、エラーが報告されます。
以下は、let が発生しない場合の変数昇格に関する MDN の説明からの抜粋です
ECMAScript 6 では、let は変数をブロックの先頭にホイストしません。その変数の let 宣言が検出される前にブロック内の変数を参照すると、変数が「一時的なデッド」状態にあるため、ReferenceError が発生します。ゾーン」は、ブロックの開始から宣言が処理されるまで続きます。
let を使用して変数を宣言した後、typeof は安全ではなくなりました
if (condition) { alert(typeof num); // Error! let num = 100; }
以前は、typeof == 'unknown' を使用して、jQuery などの特定のライブラリが導入されたかどうかを判断できました
// 判断jQuery是否引入了 if (typeof $ !== 'undefined') { // do something }...
jQuery は導入されておらず、$ も宣言されていないため、この文はエラーを報告せず、次のコードの実行に影響を与えませんが、let で宣言されている場合はエラーが報告されます。
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
