我正在阅读" Eloquent JavaScript"。第3章介绍" Closure"概念,并给你几个例子。其中一个是下一个:
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10
我想我理解这个概念。如果我首先执行console.log(twice)
,因为变量number
未定义,我得到的是[Function]
。我不明白的是twice(5)
是如何运作的。为什么使用值number
初始化局部变量5
?
另外,如果我执行console.log(multiplier(2,5))
,为什么我不会得到10?
感谢。
答案 0 :(得分:6)
因为multiplier
返回一个函数,所以twice
等于返回的函数,而不是multiplier
函数。
但是,当调用multiplier
时,factor
变量将在返回的函数中传递并使用。
为了便于理解,请考虑twice
基本上是:
var twice = function(number) {
return number * 2;
};
factor
已被替换为您在调用multiplier(2)
时传入的值。
我想我理解这个概念。如果我首先执行
console.log(twice)
,因为变量号未定义,我得到的是[Function]
。
使用console.log(twice)
时实际上并没有调用函数twice
,而只是记录它的值。因此[Function]
的输出不是因为number
未定义,而是因为您输出的是实际函数而不是结果。
另外,如果我执行
console.log(multiplier(2,5))
,为什么我不会得到10?
在这里,您通过提供2个参数来调用multiplier
,尽管您只定义了接受一个参数(factor
)的函数。在javascript中,这不会导致错误,但您只需获取factor
(factor = 2
)中映射的第一个值。
注意:即使您没有为它们定义参数,仍有一些方法可以访问所有提供的参数(here's an example)
可能会产生10
可能感兴趣的结果的东西是使用以下代码:
var result = multiplier(2)(5); // result = 10
答案 1 :(得分:2)
multiplier是一个函数,它返回一个接受参数(数字)的匿名函数
var twice = multiplier(2);
基本上是: -
var twice = function(number) {
return number * 2;
};
答案 2 :(得分:1)
如果你执行
console.log(multiplier(2,5))
你调用函数给出两个参数,而
function multiplier(factor) {}
只需要一个参数。