HiveBrain v1.2.0
Get Started
← Back to all entries
snippetjavascriptCritical

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

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
howparametersettimeoutcancallbackpass

Problem

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?

Solution

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

Code Snippets

setTimeout(function() {
    postinsql(topicId);
}, 4000);
setTimeout(postinsql.bind(null, topicId), 4000);

Context

Stack Overflow Q#1190642, score: 1317

Revisions (0)

No revisions yet.