JavaScript实现延迟任意函数执行5秒的装饰器函数问题
实现延迟执行的函数装饰器
问题分析
你需要的装饰器要满足两个核心逻辑:
- 调用装饰后的函数时,先在控制台输出提示信息:
"You will get your result in 5 seconds" - 延迟指定秒数后,再执行原函数并传递正确的参数
你的错误代码存在两个关键问题:
- 直接把
alert作为原函数传入,导致调用装饰后的函数时,传入的提示文本直接被alert弹出,没有先输出控制台提示 - 缺少先输出延迟提示的逻辑
正确实现代码
function someFunction(a, b) { console.log(a + b); } function slower(func, seconds) { // 返回装饰后的函数 return function(...args) { // 先输出延迟提示 console.log(`You will get your result in ${seconds} seconds`); // 延迟指定秒数后执行原函数,保留this指向和参数 setTimeout(() => { func.apply(this, args); }, seconds * 1000); // 注意:setTimeout的第二个参数是毫秒,需要转成秒*1000 } } // 测试示例 let slowedSomeFunction = slower(someFunction, 5); slowedSomeFunction(2, 3); // 控制台先输出:You will get your result in 5 seconds // 5秒后输出:5
针对你错误代码的修正说明
如果要基于你写的错误代码调整,需要把提示逻辑和原函数执行分开,比如:
function someFunction(x) { alert(x); } function slower(func, seconds) { return function(...args) { // 先输出控制台提示 console.log(`You will get your result in ${seconds} seconds`); // 延迟后执行原函数,这里原函数的参数应该是你想要最终弹出的内容,而不是提示文本 setTimeout(() => { func.apply(this, args); }, seconds * 1000); } } // 正确调用:传入原函数需要的参数,提示由装饰器输出 let slowedSomeFunction = slower(someFunction, 5); slowedSomeFunction('最终要弹出的内容'); // 控制台先输出:You will get your result in 5 seconds // 5秒后弹出alert:最终要弹出的内容
关键细节说明
- 使用
...args剩余参数语法来接收任意数量的参数,比arguments更直观且符合现代JS规范 setTimeout的延迟时间是毫秒,所以需要把传入的秒数乘以1000- 通过
func.apply(this, args)确保原函数的this指向和参数传递正确
内容的提问来源于stack exchange,提问作者And So What
相关产品推荐
相关产品推荐

