-1

次の例では、どのようにして y の値が 1 になるのでしょうか? 値を確認するためにログを追加しましたが、y がどのように/どこに割り当てられているかわかりません...

(function() {
    function foo(x) {
        var callNum = 0;
        var baz = 3;
        return function (y) {
            callNum++;
            console.log("callNum: " + callNum);
            console.log("y: " + y);
            console.log("baz: " + baz);
            console.log("x: " + x);
            console.log(x + y + (++baz));
        }
    }
var moo = foo(2); // moo is now a closure.
moo(1);
moo(1);
})();

フィドル出力ログは次のとおりです。

    callNum: 1   
    y: 1   
    baz: 3
    x: 2 
    7 
    callNum: 2 
    y: 1 
    baz: 4 
    x: 2 
    8 
4

2 に答える 2

2

foo()関数を返します。yこの返された関数は、関心のある単一の引数を受け入れます。

したがって、これを行うと:

// returns a function that accepts `y` with `x` shared via closure
var moo = foo(2);

// execute the inner function, passing in a value for `y`.
moo(1);

foo(2)関数を返します。 xです2mooは の値を受け入れる関数yになり、 を渡します1。今もそうyです1


別の見方をすると、次のようにして内部関数を呼び出すことができます。

foo(x)(y);

または、使用している値で:

foo(2)(1);

したがって、あなたの質問に答えると、次のようyに設定され1ます。

moo(1);
于 2013-11-14T22:51:42.493 に答える
0

あなたのコードで:

(function() {
    function foo(x) {
        var callNum = 0;
        var baz = 3;

これらは重要なパラメーターです ( xcallNum、およびbaz )。これらは、次の機能を含むクロージャーを形成します。

        return function (y) {

この関数には、外部ローカル変数 ( mooおよびfooを含む) のそれぞれに対するクロージャーがあります。

            callNum++;
            console.log("callNum: " + callNum);
            console.log("y: " + y);
            console.log("baz: " + baz);
            console.log("x: " + x);
            console.log(x + y + (++baz));
        }
    }

上記の関数と両方を含むクロージャーもありますがmoo、使用されていないため、結果には関係ありません。

var moo = foo(2); // moo is now a closure.

残りはアレックスが答えます。

于 2013-11-14T23:20:06.367 に答える