理解javascript中的回调函数

zil*_*anu 0 javascript

我试图理解Javascript中的回调功能.请找到我写的以下代码.

var genericFunction=function(arg1, arg2, callback){
  var result=setTimeout(callback(arg1, arg2), 1000);
  console.log('Result >> '+result)
  return result;
}

var sum=function(arg1, arg2){
  return arg1+arg2;
}

console.log(genericFunction(2,5,sum));
console.log('After calling the genericFUnction call.');
Run Code Online (Sandbox Code Playgroud)

我假设After calling the genericFunction call.应该打印消息,然后在10秒后打印应该打印的值7.你能解释我哪里出错吗?

这是jsfiddle

Ama*_*dan 6

你正在执行callback(arg1, arg2)当时的电话genericFunction; 它的结果7将被setTimeout作为1秒后执行的函数(1000ms不是10秒).既然7不是一个功能,setTimeout就会忽略它; 但它会返回一个有效的计时器ID,这就是你得到的结果.

您必须将未执行的功能传递给setTimeout.你可以做setTimeout(callback, 1000)- 但这没有用,因为callback在1s之后调用而不传递任何参数,它的返回值将被丢弃.所以有用的模式是这样的:

var timer = setTimeout(function() {
  var result = callback(arg1, arg2);
  console.log("result is", result);
}, 1000);
Run Code Online (Sandbox Code Playgroud)

(如果你不使用clearTimeout,你可以留下var timer =一点.)

另外,请注意,永远不能从异步执行的函数(例如执行的函数)返回值setTimeout.这个答案解释了为什么,以及做了什么.