了解Javascript函数和闭包

了解Javascript函数和闭包,javascript,Javascript,在下面的示例中,y的值如何为1?我添加了一些日志以查看值,但不了解y的分配方式/位置 (function() { function foo(x) { var callNum = 0; var baz = 3; return function (y) { callNum++; console.log("callNum: " + callNum); console.log(

在下面的示例中,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 
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
现在是
2
moo
现在是一个接受
y
值的函数,您可以传入
1
。所以
y
现在是
1


换一种方式考虑,您可以通过执行以下操作来调用内部函数:

foo(x)(y);
或者使用您正在使用的值:

foo(2)(1);
因此,在回答您的问题时,
y
在执行以下操作时设置为
1

moo(1);
在代码中:

(function() {
    function foo(x) {
        var callNum = 0;
        var baz = 3;
这些是重要的参数(x、callNum和baz)。它们形成包含以下功能的闭包:

        return function (y) {
此函数对每个外部局部变量(包括moo和foo)都有一个闭包

还有一些闭包涉及到
moo
和上述两个函数,但是它没有被使用,因此与结果无关

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

剩下的问题由Alex回答。

问题应该是:“moo里面有什么?”。一旦你得到了它,就很清楚
y
get被分配到哪里;)为什么希望
y
不是1?
y
不是“赋值”的,它被传递到函数
moo
,该函数是由
foo
返回的函数。这两次,你都通过了一个
1
,所以它是1。谢谢大家,这是一个新概念,你的回答真的帮助了我!
var moo = foo(2); // moo is now a closure.