対[<<br>>-第四章]の一つの結論の誤った論証

2375 ワード

[<>-第4章Jには「javaScript解釈器はプリコンパイル期間中に関数を処理するが、匿名関数については無視し、実行期間まで式ごとに解釈する」という言葉がある.
この結論は間違っていると思います.
JavaScriptインタプリタは、プリコンパイル期間中に関数処理および変数宣言処理を行い、実行期間まで変数の付与および式の処理を完了します.
匿名関数を無視するわけではない
  
<script Language="JavaScript">
	 test();//1
	 function test(){
	 		alert( "test1" );
	 }
	  test();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

 
私たちが以前言っていたJavaScriptは上から下まで実行されているので、このように理解すれば1のほうが間違っているはずで、2のほうがtest 1,3のほうがtest 2のはずです.
しかし、実際に私たちが見た結果は3つともtest 2でした.
どうしてこうなるんだろう
第一に、JavaScriptはでコンパイルされ、実行されます.
第二に、JavaScriptのコンパイル時に変数の宣言と関数処理を完了します.
第三に、JavaScript後に宣言された関数は、前に宣言された関数を上書きします.
上記の3つから、コンパイル時に2番目のtest関数が1番目のtest関数を上書きすることがわかります.testが実行されると、には2番目のtestの定義しか存在しないため、3つのメッセージはtest 2である
以下の例を見てください
<script Language="JavaScript">
	 test();//1
	 var test = function( ){
	 		alert( "test1" );
	 }
	  test();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

これで結果はどうなるのか.
結果は意外かもしれませんが、1はtest 2,2はtest 1,3はtest 1です.
これは、対応する変数test解釈器が対応する宣言のみを完了し、対応する付与は完了しないという2番目の説明でもよい.したがってtestの実際は第2の関数testであり、これもなぜ1がtest 2をポップアップし、コードがvar testに実行されると、変数testへの付与が完了し、匿名関数をtestのような関数2と3に付与するのがなぜ結果test 1なのか.
皆さんはここを見ても<>の理論の誤りを説明していません.焦らないでください.以下の例を見てください.
<script Language="JavaScript">
	 test();//1
	 var test1 = function test ( ){
	 		alert( "test1" );
	 }
	  test1();//2
	 function test(){
	 		alert( "test2" );
	 }
	  test();//3
</script>

 
test 1()がどのような結果になるかを考えて、<>の説明に従って有名な関数testをtest 1に付与し、解釈段階でtest関数式の処理を完了します.
結果1がtest 2,2もtest 2,3もtest 2
しかし、結果は確かに<>の結論の結果と一致していません.
実際の結果は1がtest 2,2がtest 1,3がtest 2
最初のtest関数は、解釈フェーズで処理を完了するのではなく、実行フェーズで処理を完了し、解釈フェーズのtestの関数定義を上書きすることはできません.だからこのような結果になったのです.
 
以上は私個人の見方ですが、JavaScriptの下位メカニズムについてはよく知っていて、テストのコードと結びつけてこの問題を説明するしかありません.エビの皆さんは自分の意見に合わせて意見を発表してください.