有人可以向我解释这个 JavaScript 函数的流程吗? (关闭概念)

Can someone explain me the flow of this JavaScript function? (Closure concept)

我正在阅读“Eloquent JavaScript". Chapter 3 introduces "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?

谢谢。

因为 multiplier returns 一个函数,所以 twice 等于返回的函数,而不是 multiplier 函数。

但是,当 multiplier 被调用时,factor 变量被传递并在返回的函数中使用。

所以为了更容易理解,认为 twice 基本上是:

var twice = function(number) {
    return number * 2;
};

其中 factor 已替换为您在调用 multiplier(2) 时传入的值。


I think I understood the concept. If first I execute console.log(twice), since variable number is undefined, what I get is [Function].

当您使用 console.log(twice) 时,您实际上并没有调用函数 twice,您只是记录它的值。所以 [Function] 的输出不是因为 number 未定义,而是因为你输出的是实际函数而不是它的结果。


Also, why if I execute console.log(multiplier(2,5)) I don't get 10 as a result?

此处您通过提供 2 个参数来调用 multiplier,尽管您只定义了接受一个参数的函数 (factor)。在 javascript 中,这不会导致错误,但您只会得到映射在 factor (factor = 2) 中的第一个值。

注意:即使您没有为它们定义参数,仍然有一些方法可以访问所有提供的参数 (here's an example)

可能会得到 10 的结果,可能感兴趣的是使用以下代码:

var result = multiplier(2)(5); // result = 10

如果执行

console.log(multiplier(2,5))

你调用函数时给出两个参数,而

function multiplier(factor) {}

只接受一个参数。

multiplier is a function which returns anonymous function which accepts an argument(number)

var twice = multiplier(2);

基本上是:-

 var twice = function(number) {
        return number * 2;
    };