JS闭包应用程序问题

时间:2018-02-03 20:48:30

标签: javascript closures

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分配到因子。

3 个答案:

答案 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);