Pass parameter to setTimeout callback function

How can I pass a parameter to a setTimeout() callback?

I have some JavaScript code that looks like:

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

I get an error that topicId is not defined Everything was working before I used the setTimeout() function.

I want my postinsql(topicId) function to be called after some time. What should I do?

 

回答:

setTimeout(function() {
    postinsql(topicId);
}, 4000)

You need to feed an anonymous function as a parameter instead of a string, the latter method shouldn't even work per the ECMAScript specification but browsers are just lenient. This is the proper solution, don't ever rely on passing a string as a 'function' when using setTimeout() or setInterval(), it's slower because it has to be evaluated and it just isn't right.

UPDATE:

As Hobblin said in his comments to the question, now you can pass arguments to the function inside setTimeout using Function.prototype.bind().

Example:

setTimeout(postinsql.bind(null, topicId), 4000);

 

 

下面的代码报错,undefined的错误,并且removeVote里面的index,一直是最后一次的数值

复制代码
function myLoop() {
    var upVoteButtons = document.getElementsByClassName("VoteButton--up");
    var upVoteButtonsLength = upVoteButtons.length;
    console.log(`button length is ${upVoteButtonsLength}`);
    for (var i = 0; i <= upVoteButtonsLength; i++) {
        timeout = (i + 1) * 1000; //每秒点一次
        var currentButton = upVoteButtons[i];
        this.currentButton = currentButton;
        this.index =  i;
        var that = this;
        setTimeout(function () {
            removeVote(that.currentButton, that.index);
        }, timeout)
    }
}

function removeVote(myButton, index) {
    console.log(`index = ${index}, ${myButton}`)
    myButton.click();
}

myLoop();
复制代码

 

作者:Chuck Lu    GitHub    
posted @   ChuckLu  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2020-01-20 Git rename from index.lock to index failed
2018-01-20 头脑王者 物理化学生物
2018-01-20 头脑王者 艺术,电影,体育,时尚,动漫
2018-01-20 头脑王者 音乐
2018-01-20 头脑王者 地理
2018-01-20 头脑王者 文学
2017-01-20 根据日期计算出周一和周日
点击右上角即可分享
微信分享提示