使用 setTimeout 的闭包示例无法识别函数调用

closure example using setTimeout not recognizing function call

我正在尝试创建一个关闭 delay 函数并使用回调和等待时间定义新函数的小型应用程序。然后我想使用这个新创建的内部 setTimeout 函数在等待时间后的回调中获取一个参数 运行 。

function addTwo(num) {
  return num + 2
}

const delay = (callback, wait) => {
  return setTimeout((value) => callback(value), wait)
}
var delayAddByTwo = delay(addTwo, 100)
console.log(delayAddByTwo(6))
// expected result 8 
// actual result --- Uncaught TypeError: delayAddByTwo is not a function

据我所知,在 delayAddByTwo = delay(addTwo, 100) 之后,唯一要创建的参数是 value 传递给 'inner' setTimeOut 函数内的回调。在这个例子中我错过了什么闭包?

您需要将 var delayAddByTwo = delay(addTwo, 100) 替换为 var delayAddByTwo = (num) => { delay(() => {addTwo(num)}, 100);}

function addTwo(num) {
  console.log(num + 2)
  return num + 2
}

const delay = (callback, wait) => {
  setTimeout(callback, wait)
}
var delayAddByTwo = (num) => {
  delay(() => {addTwo(num)}, 100);
}
console.log(delayAddByTwo)
delayAddByTwo(6)
// expected result 8 
// actual result --- Uncaught TypeError: delayAddByTwo is not a function

改变

var delayAddByTwo = delay(addTwo, 100)

const delayAddByTwo = delay => (addTwo, 100)

您需要将 delay return 设为另一个接受 n 的函数。 n 表示将传递给 addTwo 的数字(即回调)。 setTimeout 默认情况下 return 其 timeoutID, so, instead, you can return a Promise, which resolves to the result of calling addTwo with n. In order to get your result from the Promise, you can await it within an async function.

参见下面的示例:

const addTwo = num => num + 2;
const delay = (callback, wait) => n => new Promise(res => setTimeout(res, wait, callback(n)));

(async () => {
  const delayAddByTwo = delay(addTwo, 1000);
  const res = await delayAddByTwo(6);
  console.log(res);
})();

上面我用了setTimeoutthird argument,会作为回调的第一个参数传递给res