一般に、2 つの呼び出しの結果は同じですが、それでも違いがあります。
最初の方法:
function a( ) {
alert('old');
var b=a;
関数 a(){
b(); 🎜 >}
a();//ブラウザでメモリ オーバーフローが発生します
2 番目の方法:
alert('old');
var var a=function(){
b();
alert('new');
}
a();// ブラウザは 'old' と 'new' の順に警告します'
2 つの方法の違いはここで明確に区別できます。定義の順序が異なります。
1つ目は、関数aが最初に再定義されず、内部で実行されることです。
2 番目の方法 a = function () では、関数内で実行されないコード a が再定義されています。したがって、ここでの再定義は有効です
補足 1:
コードをコピーします
コードは次のとおりです: 関数 a(){ alert('old'); var b=a;
関数 a(){
b(); (' new');
}
コンパイル時: 最初に a がalert("old") として定義され、次に b();alert("new") として定義されます。 ;
実行時: b = function a(){b();alert("new");}、この時点では b は a と同じであり、b は関数本体で直接呼び出され、結果はa から呼び出されても b から呼び出されても同じです。
一方、
コードをコピーします。
コードは次のとおりです。 :
alert('new') ;
}
コンパイル時間: a はalert("old") として定義されます
実行時間: b=function a (){alert("old")}; a= function(){b();alert("new")}; このとき、b の関数本体には ab が含まれず、a は b のみを呼び出します。 ... 何があってもスタック オーバーフローは発生しません...
補足 2:
一般的に、コード汚染を避けるために最初の書き方が使用されますが、元の機能を保持する必要がある場合は、次のようにする必要があります。いずれにせよ、どちらの方法も w3c に準拠しています。
実際、最初の書き方は後から現れ、この書き方が最適化されました。