了解Javascript函数和闭包
在下面的示例中,y的值如何为1?我添加了一些日志以查看值,但不了解y的分配方式/位置了解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(
(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.