返回函数的参数在哪里得到它的值?

时间:2018-04-26 11:32:04

标签: javascript closures

我不知道我是否为这个问题选择了正确的标题,也许这就是为什么我也找不到这个问题的答案。

在阅读javascript书时,我在谈论闭包时发现了这个例子。

function multiplier(factor){
    console.log('factor:'+factor);
    return function(number){
        console.log('number:'+number)
        return number * factor;
    };
}

var twice = multiplier(2);
console.log('twice:'+twice(5));

在控制台中我得到了这个输出:

factor:2
number:5
twice:10

我理解闭包是什么意思,但我不明白变量数,据我所知,我期望undefined,得到值5

我的理由如下:

当我调用函数multiplier(2)时,为局部变量因子赋值2,因此第一个输出是正确的。 但当它到达return function(number){行时,它将指定编号undefined,因为之前没有为此名称分配任何值。

所以它会崩溃,并没有正确地完成我得到的输出。

愿任何人帮助我理解为什么调用twice(5)得到输出 number: 5

谢谢大家,请原谅我如果我没有以正确的方式发布问题,请随时修改任何内容以使这个问题更容易理解。

3 个答案:

答案 0 :(得分:3)

return function (number) { ... }返回一个函数。 number不是变量,它是一个函数参数。与factorfunction multiplier(factor)的参数相同。它既不是undefined也不会导致任何崩溃。

实质上,multiplier(2)会返回此函数:

function (number) {
    console.log('number:' + number)
    return number * 2;
}

...您指定给twice,因此twice现在是上述功能。

答案 1 :(得分:0)

我认为你在这里缺少的关键是返回的函数就像任何其他函数一样。该函数在被调用之前不会被输入。

return number * factor;

运行直到您致电twice。它就像

一样
console.log('factor:'+factor);

运行直到您致电multiplier。在调用函数之前,函数体不会被输入。在number被调用之前,twice没有值,但使用number的代码在调用twice之前也不会运行。

答案 2 :(得分:0)

  

但是当它到达行返回函数(数字){它将指定数字未定义时,因为之前没有为这样的名称赋值。

这是误解。记住:在Javascript中,几乎所有东西都是对象。有些人会说你经常与之交互的很多东西(字符串,数字,布尔(请注意我如何将这些类型/基元/单词首字母用小写字母表示。我通常使用大写字母表示Classes而小写字母表示原语))是原语,而不是对象。这是事实,但是出于这个线程的目的,让我们考虑(几乎)所有东西都是一个对象。

让我们回到你写的这句话:

  

当它到达行返回函数(数字){它将指定数字未定义

问题在于:当它到达行"返回函数(数字){}"时,它实际上返回一个函数,它是一个对象。

它不执行此函数,它只声明它,并将其作为Object返回。

你可能已经写过"返回666",它会返回一个Object。一个数字。

让我们继续。 你的变量"两次"现在包含一个功能。猜猜哪一个。这一个:

  

功能(数目){          的console.log('数:' +编号)          返回数*因子;      }

请记住,您已将其声明并仅在一个声明中返回: "返回功能(编号){...}"

你的"两次"变量现在等同于你可以用这种方式声明的命名函数:

  

功能两次(数字){          的console.log('数:' +编号)          返回数*因子;      }

是的,函数是对象,命名函数就像命名变量,变量可以是函数。

你可以用这种方式调用它:例如:两次(9),或者这样:两次(5)。 这就是你所做的。

现在让我们回答你的问题:

  

为什么调用两次(5)它得到输出数:5?

由于:

  

var两次= function(number){          的console.log('数:' +编号)          返回数*因子;      }

你已经执行了两次(5);"然后以这种方式执行console.log:

  

的console.log('数:' 5);

据我所知,在你的"函数乘数()"中,你不想返回一个函数,而是返回这个函数本身的结果。我建议你阅读IIFE(立即调用的函数表达式)。 有了这个,你只能在一个声明中:   - 声明一个函数   - 执行该功能   - (并最终返回其结果)

玩Javascript玩得开心。只有当你知道后面会发生什么时,Javascript才会很棒。