理解Javascript函数和闭包

时间:2013-11-14 22:43:17

标签: javascript

在以下示例中,如何给出值为1的y?我添加了一些日志记录来查看值,并且不了解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 

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

在您的代码中:

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

这些是重要的参数( x callNum 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.

其余的由Alex回答。