function multFn(num){
return function(factor){
return factor*num
}
}
var multFive=multFn(5)
console.log(multFive(2)) // outputs 10
问题是什么?:
当我在console.log(multFive(2))中知道2应该给factor参数时,JS怎么知道?我知道multFn将返回一个指向其中方法的指针。但我不知道如何将2分配到因子。
答案 0 :(得分:0)
调用第一个函数会导致内部函数返回到您的变量。当您调用该函数时,您传递的参数将转到第二个函数所期望的参数。
当您运行第一行时:
var multFive = multFn(5);
调用外部函数(multFn
)并将5
作为num
接收,因此函数的运行方式如下:
function multFn(5){
return function(factor){
return factor * 5
}
}
但是,该函数中有一个return
,它将内部函数返回给multFive
变量,所以最终结果如下:
var multFive = function(factor){
return factor * 5;
}
最后,当您调用multFive
并将其传递给2
时,2
将成为函数所期望的factor
参数的值。
console.log(multFive(2));
原因:
function(2){
return 2 * 5;
}
并且,2 * 5
= 10
。
注意:我已根据您提供的代码显示了要执行的功能。 JavaScript中有一个高级概念,名为"Closures",可以使外部函数不必始终以5
作为其值静态运行。但是,就你的问题而言,那是不相关的。
答案 1 :(得分:0)
这是function currying的一个例子。基本上,您从函数返回一个函数,在创建返回函数期间已经指定了一些必需的值。
调用multFn(5)
会在匿名函数周围创建一个闭包,该闭包对num
的引用为5。
返回的函数等同于:
function(factor){
var num=5;
return num * factor;
}
并分配给参考multFive
。
在console.log(multFive(2))
内,您正在使用参数2调用返回的函数multFive
,并得到2 * 5 = 10的结果。
答案 2 :(得分:0)
我认为你的困惑是因为你认为作业的结果是:
var multFive = multFn(5);
会是这样的:
var multFive = function multFn(num) { //num is passed 5
return function(factor) {
return factor * num;
};
}
但事实并非如此。它实际上是这样的:
var multFive = function(factor) {
return factor * num;
}
值5分配给闭包中的num
变量。在下一行:
console.log(multFive(2));
您将2直接传递给factor
参数,它将乘以先前存储在闭包中的num
值。
要查看实际情况(证明),请打印multFive
:
console.log(multFive);
这是一个有趣的测验,尝试猜测输出,然后运行它以查看:
function multFn(num) {
setTimeout(function() {
num = 3;
}, 500);
return function(factor) {
return factor * num;
};
}
var multFive = multFn(5);
console.log(multFive(2)); // outputs 10
setTimeout(function() {
console.log(multFive(2)); //what will the output be here?
}, 1000);