この記事では、javascript のプリコンパイルに関する関連知識を提供します。主にプリコンパイルの関連問題を例を通して紹介します。皆様のお役に立てれば幸いです。
ステージ (3)
- # 字句解析と構文解析: 字句解析と構文解析では、JavaScript コードに低レベルの構文が含まれているかどうかを確認します。エラー
- プリコンパイル: この記事は、
- 実行コードに焦点を当てています: 実行コードは、コードを解析する JS エンジンであり、1 行を解析して 1 行を実行します
- # #この章では主に
プロセスについて説明しますプリコンパイルプロセス
プリコンパイルも2つの時点に分かれています:
- 1 つ目は JavaScript コードが実行される前です
- 2 つ目は関数が実行される前です。
1. JavaScript コード実行前のプリコンパイル
JavaScript コードが実行される前に、まずグローバル オブジェクトが作成されます。 window- object は、
- GO
(
Global Object) オブジェクトとして理解することもできます。このオブジェクトは表示できません (印刷できません)ため、すべて # と宣言されています。
##var および - let を使用して宣言されていないグローバル変数 、変数
が GO オブジェクトに配置され、割り当てられる値は
です未定義(「変数プロモーション」を彷彿とさせます)
分析 **関数宣言:** 次に、すべての関数宣言を GO オブジェクトに入れ、関数自体の関数本体に値を代入します (関数名が属性名、値が関数本体 関数名と変数名が同じ場合は容赦なく上書きされます
) -
事例説明
<script> var a = 1; console.log(a); console.log(b); var b = 10; function fun (a) { console.log(b); var a = b = 2; var c = 123; console.log(a); console.log(b); } var a2 = 20 fun(1); </script>
上記の手順と組み合わせると、
まず、
<script></script>- で GO オブジェクト (ウィンドウ オブジェクト) が作成されます。コードを実行する前に
-
GO = { //自带的属性都不写 }
varwill 宣言されたすべてのグローバル変数と、
と - let
を使用して宣言されていない変数は、GO オブジェクトに配置され、割り当てられます。値が
関数宣言未定義
<pre class="brush:php;toolbar:false">GO = { a : undefined, b : undefined, a2 : undefined }</pre>
Anaization
の場合、関数名は属性名であり、値は関数本体です。関数名と変数名が同じだと容赦なく上書きされます -
GO = { a : undefined, b : undefined, a2 : undefined, function fun (a) { var a = b = 2; var c = 123; } }
この時、JSコード実行前のプリコンパイル処理が完了し、JSコードまず、
a に値 1 が割り当てられ、対応する変更が GO オブジェクトにも行われます: -
GO = { a : 1, b : undefined, a2 : undefined, function fun (a) { var a = b = 2; var c = 123; } }
次に a を出力します。このとき、GO オブジェクト上に変数 a が見つかり、このときの a の値は 1 であるため、
console.log(a) は 1 になります。次に b を出力し、さらに GO オブジェクトを検索すると、b の値が - 未定義
であることがわかり、console.log(b) は
b = 10;未定義
と等しくなります。次に代入ステートメントを実行します:
このとき、GO オブジェクトの - b の値は 10
## になります。 #
GO = { a : 1, b : 10, a2 : undefined, function fun (a) { var a = b = 2; var c = 123; } }
コードの次の行は **fun 関数ですが、この時点では実行されません。
これは、前のプリコンパイル プロセスで、実際にはコードのフロントエンド、つまり伝説の宣言が事前に - になっていたため、無視されました。次に、代入操作
を
a2 に実行します:
a2 = 20、GO オブジェクトも変更されます:GO = { a : 1, b : 10, a2 : 20, function fun (a) { var a = b = 2; var c = 123; } }
次に、
fun を実行します。 関数は、前述の別の時点で行われるプリコンパイルなど、関数が実行される前に行われますが、ここで関数が実行される前のプリコンパイルについて説明します。 2. 関数実行前のプリコンパイル
AO
アクティブ オブジェクト。- 関数が呼び出されるとき、関数は実行の直前に生成されます。複数の関数呼び出しがある場合、複数の AO が生成されます
-
AO オブジェクトの生成 : 関数が実行される直前に、AO アクティブ オブジェクト
- が AO 属性を分析して生成します: 仮パラメータ と
- 変数宣言## を見つけます# そして、それらを AO オブジェクトに入れます。割り当てられた値は 未定義関数宣言を分析します: 関数宣言を見つけて、それを AO オブジェクトに入れて割り当てます。関数本体に。関数名は属性名、値は関数本体です。
- AO オブジェクト上で同じ名前の属性が見つかった場合、容赦なく上書きされます
1 行ずつ実行します。
ケースの説明 - 私が取り上げたコード例は上記のものです。
最初のステップは、AO オブジェクトを作成することですAO{ }
- Find
- 仮パラメータ
and
変数宣言 それを AO オブジェクトに入れて - unknown
; 注: fun
の AO には配置されません。関数の b は var によって宣言されていませんなので、これはグローバル変数なので、
funAO{ a: undefined,//形参a与局部变量a同名 c: undefined }
実際のパラメータを
-
AO{ a: 1, c: undefined, }
検索関数宣言は AO オブジェクトに配置され、関数本体として割り当てられます。fun 関数には関数宣言がないため、この手順は無視されます。
函数执行之前的预编译完成,开始执行语句
-
执行代码
首先执行打印变量b,而此时
fun
的AO里边并没有变量b,所以会去GO对象里边找,此时的GO对象b的值为10,所以第一行代码打印出10;-
第二行代码首先要看的是
b = 2
,然后GO对象里边b的值就被改为2了。GO = { a : 1, b : 10, a2 : 20, function fun (a) { var a = b = 2; var c = 123; } }
-
然后b再赋值给a,变量a是属于局部变量a,所以
fun
的AO对象里边a的值被改为2。AO{ a: 2, c: undefined, }
-
接着下一个赋值语句是
c = 123
,所以AO对象中c的值被改为了123AO{ a: 2, c: 123, }
此时再执行
console.log(a)
的值就是AO对象里边a的值 2;执行console.log(b)
的值就是GO对象b的值 2,至此函数fun执行完毕,紧跟着fun的AO也会被销毁。
综上所述,依次打印出来的值为:
1,undefined,10,2,2
。
总结
预编译两个小规则:
- 函数声明整体提升(无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
- 变量声明提升(无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是
undefined
)
预编译前奏
-
imply global(暗示全局变量-专业术语)
即:任何变量,如果未经声明就赋值,则此变量就位全局变量所有。(全局域就是window
,这里再一次说明了JavaScript是基于对象的语言,base on window
) - 一切声明的全局变量,全是
window
的属性;var a=12;
等同于window.a = 12;
(会造成window
这个对象特别臃肿) - 函数预编译发生在函数执行前一刻(懒加载机制)
相关推荐:javascript学习教程、web前端开发视频教程
以上がJavaScriptのプリコンパイルプロセスを完全にマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

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