在以下示例中,如何给出值为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
答案 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
现在是2
。 moo
现在是一个接受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回答。