在函数中调用带有参数的JavaScript函数

时间:2016-02-08 17:11:14

标签: javascript

今天,我在下面看到了以下代码:

log_execution_time = require('./utils').log_execution_time;
var fib = function fib(n) {
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
};

var timed_fib = log_execution_time(fib);
timed_fib(5);

>>> Execution time: 1.166ms

我对函数log_execution_time感到好奇。我不知道它是怎么回事。

您可以看到log_execution_time的输入是一个函数。怎么用参数调用函数?但是w3school中的所有方法在调用函数时都需要一个参数。我假设:

var log_execution_time = function (input_function){
console.time("Execution time");
// input_function
console.timeEnd("Execution time");
}

谢谢和问候

4 个答案:

答案 0 :(得分:1)

这被称为function currying,在这种情况下,该函数正在使用一个也恰好是函数的参数。它可能看起来像这样:

function logTime(f) {
    return function() {
        var s = new Date();
        var r = f.apply(null, arguments);
        var e = new Date();
        console.log('Time taken ' + (e-s));
        return r;
    }
}

function numberlogger(n) {
    console.log("logged number: " + n)
};

var timedlogger = logTime(numberlogger);

console.log(timedlogger(2));

我们调用logTime,传递numberlogger作为参数。 JavaScript中的函数是对象,可以像其他任何东西一样传递。 logTime函数返回不同的函数,然后存储在timedlogger中。当我们调用timedlogger时,我们实际上正在调用logTime返回的函数。这使用了几个变量来跟踪计时的开始和结束时间,但使用apply(js中的每个函数都有)调用原始函数(numberlogger),同时传入任何{ {3}}提供。

答案 1 :(得分:1)

  

I think the OP is specifically about how the 5 parameter gets passed to the function input_function

函数是JavaScript中的第一类对象。您可以设置标识符并将其引用传递给与任何其他对象相同的引用。

  1. log_execution_time(fib);不会调用fib,它会将对fib的引用作为第一个参数传递给log_execution_time函数。这意味着内部可以引用fib
  2. timed_fib是一个函数,它可以引用log_execution_time调用的闭包,因为创建它时,因此它可以调用对{{1}的引用根据需要
  3. 这是一个简单的例子;

    fib

    我们也可以使用更常用的方式来调用function log(msg) { console.log(msg); } function wrap(fn) { return function () { // some anonymous function to be our wrapper console.log('Wrapped:'); fn.apply(this, arguments); // this line invokes `fn` with whatever arguments // that were passed into the anonymous function }; } var foo = wrap(log); foo('Hello World'); // logs // Wrapped: // Hello World ,例如fn,而不是fn("fizz buzz");,但这意味着我们需要了解有关如何调用{{}的更多信息1}},可能是任何东西

    有用的东西:

答案 2 :(得分:0)

我建议阅读Javascript中的函数。这是一篇来自Mozilla开发者网络(MDN)的精彩文章,在我看来,这是一个比w3schools更好的资源

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

要回答你的问题,javascript中的函数是一等公民,这意味着你可以将它们视为任何其他对象(字符串,布尔值,数字等)。它们可以保存在变量中,并且可以作为参数传递给其他函数。

在您的示例中,log_execution_time实际上将返回一个函数,这实际上是传递给它的fib函数的包装

答案 3 :(得分:0)

代码可以是这样的:

var log_execution_time = function (input_function){
var f=function(args)
{
     var t1=new Date().getTime();
     input_function(arguments);
     console.warn("Execution time:" +(new Date().getTime()-t1).toString());
}
return f;
}