2

私はJavaScript関数をいじっていましたが、コードの流れを理解するのに固執しました:この例を見てみましょう

Test = (function(arg) {
    function Test(str) {
        console.log(arg + ' ' + str);
    }

    console.log('toto');

    return Test;
})()

したがって、これを実行すると「toto」が表示されます。これを行う場合:

Test = (function(arg) {
        function Test(str) {
            console.log(arg + ' ' + str);
        }

        console.log('toto');

        return Test;
    })('titi')
Test('tata');

私は得るでしょう:

toto
titi tata

Test('tata') を書いたとき、最初の Test を呼び出しましたか? つまり、
Test = (function(arg) ...
または関数 Test(str) を実行しましたか?
そして、もし私が最初の Test を実際に実行しています.どのように Tata をその内部の関数 Test に渡しましたか?
そして最後に, Test('tata') を呼び出したときにもう一度ログに記録しなかったのはなぜですか?

4

3 に答える 3

2

匿名関数は、内部関数「Test」を返します。console.log("toto")呼び出しはその関数内にありません。

返された関数を呼び出しても、無名関数は再度呼び出されません。ただし、内部関数は、渡された「arg」値の「メモリ」を保持しているため、「titi tata」をログに記録する理由が説明されています。

したがって、段階的に何が起こるかは次のとおりです。

  1. 変数「Test」が宣言されています。
  2. 無名関数が呼び出されます。
  3. 内部関数「Test」は、無名関数のローカル コンテキストで定義されます。
  4. 「toto」ログステートメントが実行されます。
  5. ステートメントが実行され、return関数は内部関数「Test」への参照で終了します。
  6. 戻り値は、外部コンテキストの変数「Test」に割り当てられます。
  7. 返された関数は、文字列「tata」を引数として、外側の「Test」変数の参照を介して呼び出されます。
  8. 返された関数のconsole.log()ステートメントは、関数が作成されたときの「arg」の値 (「titi」) と渡された引数 (「tata」) を連結して作成された文字列を使用して実行されます。

したがって、ステップ 5 で返された関数は「titi」引数を「記憶」しているため、その関数を呼び出すと、先頭に文字列「titi」が追加されます。

于 2013-11-12T16:50:38.737 に答える
1

コードを少し分析してみましょう。

完全なコード (少し編集):

TestO = (function(arg) {
    function TestI(str) {
        console.log(arg + ' ' + str);
    }

    console.log('toto');

    return TestI;
})()

外側の部分:

TestO = function(arg) { ... } (/* 0 parameters */)

Test は、0 パラメーターで呼び出された無名関数の戻り値に初期化されます。

内部関数:

function TestI(str) {
    console.log(arg + ' ' + str); outer function
}

arg外部関数に渡される引数の値です。休館中のためご利用いただけます。

外部関数本体

console.log('toto'); 
return TestI; // this value will be passed to TestO

このコードは、TestI ではなく、TestO ではなく匿名の外部関数を呼び出したときに実行されます。外部関数は、TestO が初期化されるときに呼び出されます。

結論

匿名の外部関数は、TestO が初期化されるときに呼び出され、'toto' をログに記録し、TestI 関数 (arg匿名の外部関数のパラメーターに対するクロージャーでもあります) で TestO を初期化します。

TestO('tata') // calls TestI with the closured value of `arg` as `arg` and 'tata' as `str`
于 2013-11-12T17:03:23.590 に答える