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