使用 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);
})();
上面我用了setTimeout
的third argument,会作为回调的第一个参数传递给res
。
我正在尝试创建一个关闭 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);
})();
上面我用了setTimeout
的third argument,会作为回调的第一个参数传递给res
。