ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScriptの事前解析の原理と実装の詳細な説明

JavaScriptの事前解析の原理と実装の詳細な説明

黄舟
リリース: 2017-03-14 15:32:23
オリジナル
1382 人が閲覧しました

JavaScript がインタプリタ型言語であることは疑いの余地はありませんが、実行時に上から下まで文ごとに解析されるだけなのでしょうか?

実際、または何らかの現象は、これが当てはまらないことを証明しています。「JavaScript 決定ガイド」および関連するオンライン情報を通じて、JavaScript には「事前解析」動作があることがわかりました。この機能を理解することが重要です。理解していないと、実際の開発中に解決できない多くの問題が発生し、プログラムのバグにつながる可能性があります。この現象を分析するために、また私自身の学習の要約として、この記事は JavaScript の「事前解析」を徐々に理解できるようにします。私の意見が間違っている場合は、修正してください。

(1) JavaScript が実行時に上から下にのみ解析される場合、最初に 関数を定義してからそれを呼び出すため、次のコードが正しく実行できることは理解できます。

function showMsg() 
{ 
alert('This is message'); 
} 
showMsg(); // This is message
ログイン後にコピー

(2) コードを呼び出した後に関数を定義できることもわかり、次のコードも正常に動作します。 showMsg() が呼び出されたときに showMsg() がまだ定義されていないように見えますが、正常に動作します。これは、JavaScript が「事前解析」されていることを示しています。

showMsg(); // This is message 
function showMsg() 
{ 
alert('This is message'); 
}
ログイン後にコピー

(3) 上記は関数の例ですが、これは通常の変数の別の例です。次の例を実行すると、最初の文の msg が定義されているが初期化されていないことを示す unknown がポップアップ表示されます。これは var msg; と同じです。以下の 2 番目の文をコメントアウトすると、「メッセージが定義されていません」というエラーが報告されます。これは、JavaScript が「事前解析」されていることも示しています。

(4) JavaScript の「事前解析」についての印象を深めるために、別の例を見てみましょう。次のコードでは、ダイアログ ボックスが 2 回表示され、「これはメッセージ 2 です。これはなぜですか?」と表示されていることがわかります。実際、以下では同じ名前の 2 つの関数が続けて定義されており、後の showMsg() は以前に定義された関数を上書きします (JavaScript では、同じ名前の変数にも上書きの問題が発生します)。つまり、最初の showMsg() が定義されます。廃棄されます。 showMsg() の 2 回目の呼び出しで、上で定義したメッセージ 1 関数が呼び出されないのはなぜですか?これは、JavaScript に「事前解析」動作があることを再度証明しています。

showMsg(); // This is message 2 
function showMsg() 
{ 
alert('This is message 1'); 
} 
showMsg(); // This is message 2 
function showMsg() 
{ 
alert('This is message 2'); 
}
ログイン後にコピー

(5) JavaScript の「事前解析」とは、変数または関数を呼び出し可能な環境 (変数実行時環境) に事前に解析することです。次のコードは、alert(msg) の前に msg の定義を確認したように見えますが、プログラムは依然として「msg が定義されていません」というエラーを報告します。これは、関数内で定義された変数が関数のプライベート変数であり、使用できないためです。これは、JavaScript の「事前解析」が、定義されたすべての変数をウィンドウなどのグローバル

オブジェクト

に解析することを意味しないことを示しています。

(6) JavaScript の「事前解析」はセクション内、正確には
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート