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

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

黄舟
黄舟オリジナル
2017-03-14 15:32:231383ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。