1

この例は、StoyanStefanovによるObjectOrientedJavaScriptという本の79ページから入手しました。どうすればよいかわからないので、このプログラムを初めて実行したとき(Enterキーを押して)、「undefined」が返されました。その後、作者の指示に従って、私はそれを呼び出しa();、アラート「Workyworky」を受け取りました

私の質問は

a)最初のステップを正しく実行しましたか?つまり、「Enter / Return」を押すだけで自己呼び出しプログラムを実行することになっていますか?

b)プログラムを実行するために「Enter / Return」を押すだけで正しかったのに、なぜ「undefined」の結果が得られたのですか。このプログラムは、(最初​​の実行時に)関数actualWork()への参照をリファントすると著者は言います。参照を返す場合、なぜそれが未定義と見なされるのですか?どういうわけか重要ですか?

jsfiddle.netにコードを入力して実行を押しても何も起こらなかったが、コンソールで最初に実行したときに「未定義」になり、その後a()を実行したときにアラートが発生したことに注意してください。

var a = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
}();
4

5 に答える 5

4

このコードは次と同等です。

var f = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
};

var a = f();

だから:あなたは変数を作成fし、それに関数を割り当てています。f()次に、呼び出しの結果をに割り当てますa。これはたまたま関数でもあります (これは元のコードで暗黙的に行われます)。そして最後に、 によって返さa()た関数を実行する を実行できます。f()

于 2011-03-20T10:55:00.907 に答える
4

「自己呼び出し」とは、すべてのコードが関数内にある場合でも、このコードがコンパイラによって実行された直後に効果があることを意味します。これは、関数がすぐに呼び出されるために発生します (()最後の行のもの)。

これは、あなたがちょうど書いた場合に起こったことでもあります

function someSetup(){
    var setup = 'done';
}
function actualWork(){
    alert('Worky-worky');
}
someSetup();
return actualWork;

ここでの違いは、「自己呼び出しプログラム」(それが何であるかについての悪い説明です、IMHO)を使用すると、名前を作成せずにこれを実行できsomeSetupactualWork呼び出し元のコードに表示されることです-これは一般的に望ましいことです。

それを説明したので、あなたの質問に答えましょう:

  1. コード スニペット自体は何もしません(関数によって返されるものreturnに代入する場合でも)。したがって、JS IDE はその戻り値が であることを報告します。aundefined
  2. 関数への参照は正常actualWorkに返されます (これは に割り当てられた値aです)。で正常に呼び出したときに、自分でそれを見ましたa()
于 2011-03-20T10:56:48.740 に答える
2

a)インタプリタの動作に応じて、はい、スクリプトを実行するだけで(returnキーを押す)、関数a()が定義されます。

b)プログラム自体は何も返さないので、「undefined」を返しましたが、関数a(); します。上で引用したコードは関数a()を表します。これを呼び出すと、次のようになります。

  1. 他の2つの(一時的な)関数を定義する
  2. それらの1つを実行します(someSetup)
  3. もう一方を返します。

だから私は次の方法でプログラムを使用します:

  1. a()を定義するために実行しています。
  2. 呼び出しvar x=a();
  3. (オプション)チェックするsetup=='done'
  4. x();(a()によって返された)呼び出しはアラートを表示するはずです。

編集 申し訳ありませんが、}();が表示されませんでした。最後に、100%正しくありません。(); 最後に、JonとTomaszの両方が言ったように、「関数の戻り値を新しい関数として受け取り、すぐに実行する」の短縮形です。

于 2011-03-20T10:53:49.880 に答える
1

undefindedOKのステートメントから返されvar a = ...ます。参照は、割り当ての右側から返されます。

于 2011-03-20T10:51:38.513 に答える
1

無名関数はすぐに呼び出され、そのactualWork中の関数への参照を返します。したがってa、この参照が含まれており、単独で呼び出すことができます。だからa();あなたに警告を与えるべきです。

于 2011-03-20T10:56:37.927 に答える