前解析

4309 ワード

関数の事前解析:
1、javascriptは実行前に「事前解析」のような操作を行います.まず現在の実行環境における活動対象を作成し、varで宣言された変数、定義された関数を活動対象の属性に設定しますが、これらの変数の割り当てはすべてundefinedです.
 
2、javascript解釈実行段階で変数が解析したい場合、まず現在実行環境の活動対象から検索します.もし›が見つからなかったら、その実行環境の所有者がprototype属性がある場合はプロトタイプチェーンから検索します.そうでない場合はフィールドチェーンで検索します.var a=...このようなステートメントに遭遇すると、対応する変数に値が割り当てられます.
例1:
function handle(){      
	 alert(arg1);       
   } ;  
     
   handle();       
   var arg1 = 20;
 結果は:undefinedです.var arg 1=20まで説明していますので.これは前にarg 1の値を印刷しましたが、まだarg 1に値を与えていません.
 
例2:
 alert(handle);    
 var handle = function (){ 
        alert(20);     
 }; 
 結果:undefined
 
 
handle();

var handle=function (){
      alert("  ");
}
 handle is not a function.handle()という文を実行する時、handleに値を付けていないからです.関数定義.に変更すると:
 handle();    
 var handle = function handle (){ 
        alert(20);     
 }; 
 
IEの下でダイアログが表示されます.これはvar handle...関数定義として同時に解釈されます.関数定義はプリコンパイルの時に値があるべきです.だから実行できます.しかし、FFでは依然として一つの変数申明として解釈されています.この文が実行されたことを知っていれば、その値が与えられます.
したがって、変数が初期化される前に変数を使用することは避けられます.
 
 
JavaScriptは解釈型言語であることは間違いないですが、それは運行時に上から下へと一言で解析しただけですか?実際にはある現象ではないと証明されています.「JavaScript権威ガイド」とネット関連の資料を通じて、JavaScriptには「事前解析」行為があることが分かりました.この特性を理解することはとても重要です.実際の開発では解析できない問題がたくさん発生し、プログラムバグの存在にもつながるかもしれません.この現象を解析するために、自分の勉強のまとめとして、本論文ではJavaScriptの「事前解析」を紹介します.もし私の見解が間違っていたら、指摘してください.
(1)JavaScriptが実行時に上から下へ逐句解析した場合、以下のコードが正しく動作することは理解できます.私たちは先に関数を定義してから呼び出します.
function showMsg()
{
    alert('This is message');
}
showMsg(); // This is message
 
(2)関数はコードを呼び出した後で定義できることも知っています.下記のコードも正常に動作することができます.ショーMsg()を呼び出したときにショーMsg()はまだ定義されていませんが、正常に動作するとJavaScriptは「事前解析」です.
showMsg(); // This is message
function showMsg()
{
    alert('This is message');
}
 
(3)上は関数の例です.次は普通変数の例を示します.以下の例では、動作はundefinedをイジェクトします.最初の文のmsgはすでに定義されています.初期化されていないだけで、var msgと同じです.alert(msg)同じです.次の二番目の文を注釈したら、「msg未定義」というエラーがあります.これはJavaScriptが「前解析」であることをも示しています.
alert(msg); //undefined
var msg='This is message';
 
(4)もう一つの例を見て、JavaScriptの「前解析」イメージを深める.以下のコードで2回目のダイアログが表示されます.This is message 2です.なぜですか?実は次の前の1つの後で2つの同名の関数を定義して、後のshowMsg()は前の定義の(JavaScriptの中で、同名の変数は同様に覆い隠す問題があります)を覆って、第1のshowMsg()が廃棄されましたに等しいです.なぜ2回目の呼び出しのショーMsgは上で定義されているメッセージ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「前解析」はセグメント化され、正確には「script」ブロックに分けて行われます.次のコードは同じページの2つのスクリプトブロックに現れ、同じ名前の関数を3つ定義します.プログラム実行の結果、2番目のスクリプトブロックのshowMsgは前の2つのshowMsg()をカバーしていませんが、最初のスクリプトブロックの2番目のshowMsg()は最初のshowMsg()をカバーしています.
<body>
<script type="text/javascript">
showMsg(); //This is message 2
function showMsg()
{
    alert('This is message 1');
}
function showMsg()
{
    alert('This is message 2');
}
</script>

<script type="text/javascript">
function showMsg()
{
    alert('This is message 3');
}
</script>
</body>
 ソース:
http://archive.cnblogs.com/a/1984625/
参考:
http://varnow.org/?p=171
です.