-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;

这些是重要的参数(xcallNumbaz)。它们形成涉及以下功能的闭包:

        return function (y) {

该函数对每个外部局部变量(包括moofoo)都有一个闭包。

            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 回答