今天,我在下面看到了以下代码:
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");
}
谢谢和问候
答案 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 functioninput_function
函数是JavaScript中的第一类对象。您可以设置标识符并将其引用传递给与任何其他对象相同的引用。
log_execution_time(fib);
不会调用fib
,它会将对fib的引用作为第一个参数传递给log_execution_time
函数。这意味着内部可以引用fib
timed_fib
是一个函数,它可以引用log_execution_time
调用的闭包,因为当创建它时,因此它可以调用对{{1}的引用根据需要这是一个简单的例子;
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;
}