有人可以解释如何返回并调用此传递的函数吗? - Javascript

时间:2017-01-19 13:00:21

标签: javascript function return closures this

我正在阅读一篇关于包装函数的文章,并且遇到了这个示例,它展示了如何包装函数以确定其性能。

function profile(func, funcName) {
  return function () {
    var start = new Date(),
      returnVal = func.apply(this, arguments),
      end = new Date(),
      duration = stop.getTime() - start.getTime();

    console.log(`${funcName} took ${duration} ms to execute`);
    return returnVal;
  };
}

var profiledMax = profile(Math.max, 'Math.max');
profiledMax.call(Math, 1, 2);
// => "Math.max took 2 ms to execute"

我因为这些问题而感到困惑:

returnVal = func.apply(this, arguments),

return returnVal;

我调查它的方式,当你调用profile(Math.max ...)时,它将返回一个匿名函数,那么为什么用参数调用匿名函数呢?我本以为你需要返回然后调用那个匿名函数来访问returnVal,这也是一个函数?像这样:

var profiledMax = profile(Math.max, 'Math.max');
var moreProfiledMax = profiledMax();
moreProfiledMax.call(Math, 1,2) 

2 个答案:

答案 0 :(得分:1)

returnVal不是函数,而是调用func的结果。 apply方法将执行该方法,而bind将返回一个函数。

答案 1 :(得分:1)

好吧,这很简单,首先你有这个函数包装另一个函数

function profile(func, funcName) {
  return function () {
    var start = new Date()**;**
      returnVal = func.apply(this, arguments)**;**
      end = new Date()**;**
      duration = stop.getTime() - start.getTime();

    console.log(`${funcName} took ${duration} ms to execute`);
    return returnVal;
  };
}

这一行:

var profiledMax = profile(Math.max, 'Math.max');

执行outter函数传递它将保存在outter函数定义的内部函数范围内的参数。最后返回内部函数,就好像你有:

 var profiledMax =  function () {
        var start = new Date();
          returnVal = **Math.max**.apply(this, arguments);
          end = new Date();
          duration = stop.getTime() - start.getTime();

        console.log(`${funcName} took ${duration} ms to execute`);
        return returnVal;
      }

然后这一行:

profiledMax.call(Math, 1, 2);

执行profiledMax传递2个参数(您可以将参数传递给JS中的任何函数)并将this关键字绑定到Math对象,就像执行此函数一样:

function () {
    var start = new Date(),
      returnVal = Math.max.apply(**Math**, arguments),
      end = new Date(),
      duration = stop.getTime() - start.getTime();

    console.log(`${funcName} took ${duration} ms to execute`);
    return returnVal;
  };

提案的问题在于:var moreProfiledMax = profiledMax(); returnVal = func.apply(this, arguments);会中断,因为范围内不存在func。