有人能解释一下这个JavaScript函数的流程吗? (关闭概念)

时间:2016-08-03 09:35:36

标签: javascript closures currying

我正在阅读" 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?

感谢。

3 个答案:

答案 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中,这不会导致错误,但您只需获取factorfactor = 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) {}

只需要一个参数。