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();

 

posted @ 2021-01-20 23:25  ChuckLu  阅读(92)  评论(0编辑  收藏  举报