0

関数を別の方法iで呼び出すことで、別の値を取得しています。add誰かがここで何が起こっているのか説明できますか?

var i = 0;
var add = function() {
    ++i;
    return function() {
        i++;
        return function() {
            i++;
            add();
        }
    }
 };
add(); // i = 1;
add()(); // i = 2;        
add()()(); // i = 4;

</p>

4

5 に答える 5

4

関数は関数をadd返します。そして、この関数は別の関数を返します。

それで :

add(); // Executes add, which returns a function.
add()(); // Execute the function returned by add.
add()()(); // Execute the function returned by the function returned by add

各関数は、i値に1を加算するだけです。それが価値を説明していiます。

于 2012-12-21T14:56:14.827 に答える
1

関数addは関数を返します。だからあなたがこれを呼ぶとき:

add();

コード(++i)が実行され、関数が返されます。その関数では何もしませんが、できます。あなたはそれを実行することができます:

add()();

これは++i、実行され、関数を返し、その関数(実行されるi++)を実行し、別の関数を返します(その内部関数も関数を返すため)。

等々。関数は他の関数を返しているので()、呼び出しに別の関数を追加すると、返されている関数が実行されます。

于 2012-12-21T14:57:11.003 に答える
1

add で関数を返しています

電話だけで

add()

関数が実行され、i が 1 増加します // 1

電話すると

add()()

によって返される関数もadd実行されるため、2 ずつ増加 iします // 2

add()()()

add返された関数と、返された関数が返す関数を呼び出します。この関数もそれを呼び出しますadd。したがって、i が 4 増加します。

しかし、投稿されたコードが少し間違っていると思います。値は

add() //i = 1
add()() // i = 3
add()()() //i = 7
于 2012-12-21T14:58:33.320 に答える
0

内部add()で新しい関数が返されます。

したがって、呼び出しが最初add()()に実行されます。add()その後、によって返される関数add()が実行されます

于 2012-12-21T14:57:05.967 に答える
0

JavaScript では、「()」は関数呼び出し演算子です。したがって、「()」を呼び出すたびに、この演算子の前に関数を呼び出そうとします。あなたの場合、追加する関数が割り当てられています。各関数に名前を付けて、非常に理解しやすいようにします。

var i = 0;
var add = function one() {
++i;
return function two() {
    i++;
    return function three() {
            i++;
            add();
        }
    }
};

// This will execute function one 
// and return function two.
add();   

// This will execute function one and two, 
// return function three
add()(); 

// This will execute function one, two, three,
// return function two. Why?
// Because in function three, we call add() which will execute
// function one and return function two as I mentioned above.
add()()();

それでは、関数呼び出しを本当に理解しているかどうか見てみましょう。

var i = 0;
var add = function one() {
i++;
return function two() {
    i++;
    return function three() {
            i++;
        }
    }()
};

無限ループを避けるために関数 3 内の関数 add() を削除し、関数 2 の後に "()" を追加します。では、今 add() を呼び出すとどうなるでしょうか?

// This will execute function one and return function two, 
// function two will invoke itself because of "()" at the end 
// I added and return function three. So call add() will 
// execute function one and function two, return function three.
// So i = 2 in this case.
add();

自信が持てるまで、これらの関数呼び出しを 1 日中いじることができます。

于 2012-12-21T15:27:15.820 に答える