• 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();
  • 相关阅读:
    46 Simple Python Exercises-Higher order functions and list comprehensions
    IDEA一些设置
    DDD建模案例----“视频课程”场景
    LA 4727
    uva 1377
    uva 1421
    UVA
    LA 4731
    uva 11404
    uva 11143
  • 原文地址:https://www.cnblogs.com/chucklu/p/14305716.html
Copyright © 2020-2023  润新知