検索
ホームページウェブフロントエンドjsチュートリアルjs の変数プロモーション メカニズムの詳細な紹介

js の変数プロモーション メカニズムの詳細な紹介

変数プロモーション

JavaScript における変数プロモーションには、var で宣言された変数と function で宣言された変数の 2 種類があります。

var で宣言された変数

まず次のコードを見てみましょう。

コード 1

console.log(a);

var a;

From によると、a の値は何ですか。従来のプログラミング言語の考え方では、コードは上から下に向かって実行されます。この考え方によれば、2行目に到達した時点では変数aが定義されていないため、エラーaはエラーとなります。 「未定義

」と報告されますが、実際には答えは未定義です

まあ、疑問はありますが、次のコードを見てみましょう

var a;
console.log(a);

2つの部分が一致していることがわかりました。のコードは同じなので、新しい質問があります。それは、var a があるかどうかは問題ではありません。その答えは常に未定義であり、変数が改善されるかのような錯覚を引き起こすため、コード 3 を書きました。

コード 3

console.log(a);

わかりました、ようやくエラーが報告されました。つまり、これは JavaScript コードが上から下まで実行されていないことを証明しています。少なくとも表面的には次のように見えます。

それでは、コード 4 を見てみましょう

コード 4

console.log(a);
var a = 2;

変数はプロモートされているため、答えは 2 ですが、実際にはまだ未定義です。なぜでしょうか。

現時点では、構文解析やコード生成などの汚れた作業を担当するコンパイラに依頼する必要があります。

コンパイラは var a = 2; を認識すると、それを 2 つの宣言、var a; と a = 2 として扱います。最初の宣言はコンパイル段階で行われ、2 番目の宣言は待機中になります。実行フェーズに適しています。

つまり、上記のコードは次のコードになります

var a;
console.log(a);
a = 2;

したがって、最終的には未定義になります

さて、冗長になりますが、このコードを見てください。 5

コード 5

a = 2;
var a;
console.log(a);

このコードの実際の実行順序とその答えは、誰もがすでに知っているはずです。はい、答えは 2 ですが、私が言いたいのは、変更することです。 2 行目はコメントアウトされていますが、答えは 2 のままですが、これは変数の昇格とは関係ありません。これは厳密モードと非厳密モードの問題です。非厳密モードでは、開発者はキーワードを使用してはなりません。変数を宣言しますが、厳密モードではこれは不可能です。エラーが報告されます。

関数で宣言された変数

var と同様、関数で宣言された変数もプロモートされます。

log(5);

function log(mes){
  console.log(mes)
}

変数プロモーションに関するこれまでの理解によれば、このコードの実際のシーケンスは次のとおりです。

function log(mes){
  console.log(mes)
}

log(5);

非常に良い、非常に正しいです。次のコードを見てください

log(5);

var log = function(mes){
  console.log(mes)
}

エラーが報告されました。ログは関数ではありません。ここから、この種の関数式は昇格されないことがわかります。関数宣言のみが昇格されます。先頭にコード console.log の行を追加してみてください。(log ) の場合、unknown が最初に出力されます。

したがって、ここでの実際の順序は次のとおりです

var log;
log(); //这时候只是声明了log这个变量,并不是函数,却用函数的方法调用它,所以会报错,说这不是一个函数。
log = function(mes){
  console.log(mes)
}

関数内で変数を宣言するには var を使用します

var で宣言された変数が昇格されることはわかっていますが、実際にはそうではありません。どの程度まで改善されるのか分かりません。

この前にコードを見てみましょう

var a = 4;

function foo(){
  var a = 5;
  console.log(a);

}
foo();

console.log(a)

答えは 5,4 で、最初に 5 を出力し、次に 4 を出力します。

var で宣言された変数には関数スコープがあるため、foo 内の a は外部の foo と関係がありません。この状況はまさに私が望んでいることです。

コードを再度変更してください

function foo(){
  a = 5
  console.log(a);
  var a;
}
foo();

console.log(a)

答えは 5、a は定義されていません

コードの 4 行目は 5 を出力し、9 行目はエラーを報告します。

この場合、変数の昇格は、変数が配置されているスコープの先頭にのみ昇格され、親スコープには昇格されません。

したがって、結論を導き出すことができます。変数のプロモーションは、変数をそのスコープの先頭にのみプロモートします。

関数の優先順位

var と function を使用するため、変数には昇格という機能があるので、同じ変数を両方で宣言するとどうなるでしょうか? タイトルを見れば関数が優先されることがわかります。

コードを詳しく見てください

foo();

var foo;

function foo(){
  console.log(1)
}

foo = function(){
  console.log(2)
}

答えは 1です

このコードは実際には次のようになります

function foo(){
  console.log(1)
}

foo();// 1

foo = function(){
  console.log(2)
}

よく見てください、var foo; が消えていますはい、エンジンによって無視され、重複した宣言とみなされて破棄されました。

わかりました。var で宣言された変数は関数宣言ほど優れていないため、関数宣言を使用して同じ変数を複数回宣言します。

foo()
function foo(){
  console.log(1);
}
foo()
function foo(){
  console.log(2);
}
foo()
function foo(){
  console.log(3);
}

foo()

foo は 3 回宣言され、4 回呼び出されます。各呼び出しの結果は 3 なので、最後の関数宣言は前の関数宣言を上書きします

しかし、var はまだ苦労したいのです。自分の存在意義を証明する必要があると今でも感じています。

foo()
function foo(){
  console.log(1);
}
var foo;
foo()
foo = function(){
  console.log(2);
}
foo()
function foo(){
  console.log(3);
}

foo()

注意して見てください。コードの中間部分が変更されており、3、3、2、2 を順番に出力しています。

var foo は無視されますが、次の関数は依然として役立ちます。コードは次のようになります。

function foo(){
  console.log(3);
}

foo();//3
foo();//3
foo = function(){
  console.log(2);
}
foo();//2
foo();//2

通常のブロック内で関数を宣言します

#以前はスコープ内で関数を宣言していましたが、ブロック内で関数を宣言します

function foo(){

  console.log(b); // undefined
  b(); //TypeError: b is not a function

  var a = true;

  if(a){
    function b(){
      console.log(2)
    }
    //下面这段代码和上面的结果一样
    // var b = function(){
 //      console.log(2)
 //    }
  }
  //b() --> 这里会被执行

}

foo()

上記のことから、b は未定義であるため、この変数はまだ存在しますが、関数ではないことがわかります。この状況は、関数式を使用する場合と似ています。

概要


1. プロモーションは関数宣言のプロモーションと変数宣言のプロモーションに分けられます

2. var を使用して変数を宣言し、function を使用して関数を宣言します

3. 変数の昇格により、変数がそのスコープの最上位に昇格されます。

4. 関数式には昇格メカニズムはありません。

5. 関数宣言と変数宣言の宣言同じ識別子を同時に使用するシンボルでは、関数宣言が優先されます

6. 複数の関数が同じ識別子を宣言する場合、最後の宣言が前の宣言を上書きします

推奨チュートリアル: js チュートリアル

以上がjs の変数プロモーション メカニズムの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は脚本之家で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SecLists

SecLists

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