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

Noo*_*r_1 5 javascript closures currying

我正在阅读" Eloquent JavaScript ".第3章介绍了" 闭包 "概念,并给出了几个例子.其中一个是下一个:

function multiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

var twice = multiplier(2);
console.log(twice(5));
// ? 10
Run Code Online (Sandbox Code Playgroud)

我想我理解这个概念.如果我先执行console.log(twice),因为变量number是未定义的,我得到的是[Function].我不明白的是如何twice(5)运作.为什么局部变量number用值初始化5

另外,为什么如果我执行console.log(multiplier(2,5))我不会得到10结果?

谢谢.

mus*_*fan 6

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

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

因此,为了使其更容易理解,请考虑twice基本上:

var twice = function(number) {
    return number * 2;
};
Run Code Online (Sandbox Code Playgroud)

factor调用时传入的值已被替换的位置multiplier(2).


我想我理解这个概念.如果我先执行console.log(twice),因为变量号未定义,我得到的是[Function].

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


另外,为什么如果我执行console.log(multiplier(2,5))我不会得到10结果?

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

注意:即使您没有为它们定义参数,仍有一些方法可以访问所有提供的参数(这是一个示例)

要获得10可能感兴趣的结果的东西是使用以下代码:

var result = multiplier(2)(5); // result = 10
Run Code Online (Sandbox Code Playgroud)