zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    迭代器,生成器的理解
    需求
    关于dom 0级 2级 3级事件的理解
    夯实前端基础
    前端面试题 收集
    前端易忘点,持续更新
    form target 文件上传
    ES6 symbol
    bzoj1260 [CQOI2007]涂色paint
    bzoj1083 [SCOI2005]繁忙的都市
  • 原文地址:https://www.cnblogs.com/chucklu/p/14305716.html
Copyright © 2011-2022 走看看