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';
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未定义