我不知道我是否为这个问题选择了正确的标题,也许这就是为什么我也找不到这个问题的答案。
在阅读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
?
谢谢大家,请原谅我如果我没有以正确的方式发布问题,请随时修改任何内容以使这个问题更容易理解。
答案 0 :(得分:3)
return function (number) { ... }
返回一个函数。 number
不是变量,它是一个函数参数。与factor
中function 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才会很棒。