我在Mozilla开发者页面中找到了这个例子,但是无法理解这个概念。
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3); //returns inside(y) -- from firebug
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
似乎3在某种程度上存储在函数“inside
”中,并且在第二次调用期间将其添加为5并返回8。
与第一次调用不同,第二次调用外部(outside(3)(5)
)如何返回值(8)而不是内部函数(inside
)?
答案 0 :(得分:2)
似乎3有点存储在'inside'函数中,在第二次调用期间将其添加为5并返回8。
右。每次调用outside
都会创建一个新的 inside
函数,该函数将调用绑定到outside
的数据。它“关闭”了这些数据。这些被称为“闭包”。不要让这个名字困扰你,closures are not complicated。
与第一次调用不同,第二次调用外部(外部(3)(5))如何返回值(8)而不是内部函数(内部)?
对outside
的第二次调用返回一个函数(该调用生成的inside
函数);但是你随后用第二对()
调用该函数。
该行
outside(3)(5);
...像这样分解:
var f = outside(3); // Create and get the `inside` function bound to 3
f(5); // Call it, passing in `5`
来自你的评论:
所以你的意思是,在
outside(3)
的第一次调用中,'返回'inside
方法定义变为(更改为?)返回3 + y;
。是吗?
关闭,但不完全。 x
的值未归入inside
; inside
引用了创建它的上下文,并且该上下文使它可以访问x
参数。这些并不完全相同,我们可以看到,如果我们稍微更新一下这个例子(并抛弃数学,这只是模糊了事情):
function outside(name) {
// 'inside' uses the 'name' argument from the call to 'outside' that created it
function inside() {
return name;
}
// 'changer' *changes* the 'name' argument's value
function makeCaps() {
name = name.toUpperCase();
}
// Return both of them
return {
inside: inside,
makeCaps: makeCaps
};
}
var funcs = outside("foo");
funcs.inside(); // "foo", because 'inside' uses the 'name' created
// by the call to 'outside', and that 'name' is
// currently "foo"
funcs.makeCaps(); // Changes that same 'name'
funcs.inside(); // "FOO", because that 'name' has been changed
了解inside
和changer
关闭相同的上下文是关键,这是创建它们的outside
调用的上下文。
理解每次调用outside
时都会创建新的上下文和新函数也是关键:
var funcs1 = outside("foo");
var funcs2 = outside("separate");
funcs1.inside(); // "foo"
funcs2.inside(); // "separate"
funcs1.makeCaps();
funcs1.inside(); // "FOO"
funcs2.inside(); // "separate"
答案 1 :(得分:0)
您的变量'X'在外部函数的范围内以及您的内部函数。因此,当你调用外部函数时,它会在里面创建新函数并存储你的变量X,然后,当执行对内部函数的调用时,你已经有了X并且只是从它的args中得到了Y.