You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现延迟任意函数执行5秒的装饰器函数问题

实现延迟执行的函数装饰器

问题分析

你需要的装饰器要满足两个核心逻辑:

  1. 调用装饰后的函数时,先在控制台输出提示信息:"You will get your result in 5 seconds"
  2. 延迟指定秒数后,再执行原函数并传递正确的参数

你的错误代码存在两个关键问题:

  • 直接把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:10:31