ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptの事前解析の原理と実装の詳細な説明
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 が「事前解析」されていることも示しています。 alert(msg); //undefined
var msg='This is message';
(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 の「事前解析」が、定義されたすべての変数をウィンドウなどのグローバル
オブジェクト に解析することを意味しないことを示しています。 function showMsg()
{
var msg='This is message';
}
alert(msg); // msg未定义
(6) JavaScript の「事前解析」はセクション内、正確には 3f1c4e4b6b16bbbd69b2ee476dc4f83a ブロック内で実行されます。次のコードは同じページの 2 つのスクリプト ブロックにあり、同じ名前の 3 つの関数を定義しています。プログラムの実行結果は、2 番目のスクリプト ブロックの showMsg() が最初の 2 つの showMsg() をカバーしていないのに対し、最初のスクリプト ブロックの 2 番目の showMsg() が最初の showMsg() をカバーしていることを示しています。
以上がJavaScriptの事前解析の原理と実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。