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

前端 未结 28 2316
既然无缘
既然无缘 2020-11-21 07:31

I have some JavaScript code that looks like:

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==         


        
相关标签:
28条回答
  • 2020-11-21 08:02

    // These are three very simple and concise answers:

    function fun() {
        console.log(this.prop1, this.prop2, this.prop3);
    }
    
    let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };
    
    let bound = fun.bind(obj);
    
    setTimeout(bound, 3000);
    
     // or
    
    function funOut(par1, par2, par3) {
    
      return function() { 
    
        console.log(par1, par2, par3);
    
      }
    };
    
    setTimeout(funOut('one', 'two', 'three'), 5000);
    
     // or
    
    let funny = function(a, b, c) { console.log(a, b, c); };
    
    setTimeout(funny, 2000, 'hello', 'worldly', 'people');
    
    0 讨论(0)
  • 2020-11-21 08:03

    My answer:

    setTimeout((function(topicId) {
      return function() {
        postinsql(topicId);
      };
    })(topicId), 4000);
    

    Explanation:

    The anonymous function created returns another anonymous function. This function has access to the originally passed topicId, so it will not make an error. The first anonymous function is immediately called, passing in topicId, so the registered function with a delay has access to topicId at the time of calling, through closures.

    OR

    This basically converts to:

    setTimeout(function() {
      postinsql(topicId); // topicId inside higher scope (passed to returning function)
    }, 4000);
    

    EDIT: I saw the same answer, so look at his. But I didn't steal his answer! I just forgot to look. Read the explanation and see if it helps to understand the code.

    0 讨论(0)
  • 2020-11-21 08:04

    The answer by David Meister seems to take care of parameters that may change immediately after the call to setTimeout() but before the anonymous function is called. But it's too cumbersome and not very obvious. I discovered an elegant way of doing pretty much the same thing using IIFE (immediately inviked function expression).

    In the example below, the currentList variable is passed to the IIFE, which saves it in its closure, until the delayed function is invoked. Even if the variable currentList changes immediately after the code shown, the setInterval() will do the right thing.

    Without this IIFE technique, the setTimeout() function will definitely get called for each h2 element in the DOM, but all those calls will see only the text value of the last h2 element.

    <script>
      // Wait for the document to load.
      $(document).ready(function() {
      $("h2").each(function (index) {
    
        currentList = $(this).text();
    
        (function (param1, param2) {
            setTimeout(function() {
                $("span").text(param1 + ' : ' + param2 );
            }, param1 * 1000);
    
        })(index, currentList);
      });
    </script>
    
    0 讨论(0)
  • 2020-11-21 08:04

    @Jiri Vetyska thanks for the post, but there is something wrong in your example. I needed to pass the target which is hovered out (this) to a timed out function and I tried your approach. Tested in IE9 - does not work. I also made some research and it appears that as pointed here the third parameter is the script language being used. No mention about additional parameters.

    So, I followed @meder's answer and solved my issue with this code:

    $('.targetItemClass').hover(ItemHoverIn, ItemHoverOut);
    
    function ItemHoverIn() {
     //some code here
    }
    
    function ItemHoverOut() {
        var THIS = this;
        setTimeout(
            function () { ItemHoverOut_timeout(THIS); },
            100
        );
    }
    function ItemHoverOut_timeout(target) {
        //do something with target which is hovered out
    }
    

    Hope, this is usefull for someone else.

    0 讨论(0)
  • 2020-11-21 08:06

    The easiest cross browser solution for supporting parameters in setTimeout:

    setTimeout(function() {
        postinsql(topicId);
    }, 4000)
    

    If you don't mind not supporting IE 9 and lower:

    setTimeout(postinsql, 4000, topicId);
    

    setTimeout desktop browser compatibility

    setTimeout mobile browser compatibility

    https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

    0 讨论(0)
  • 2020-11-21 08:06

    if you want to pass variable as param lets try this

    if requirement is function and var as parmas then try this

    setTimeout((param1,param2) => { 
         alert(param1 + param2);
         postinsql(topicId);
    },2000,'msg1', 'msg2')
    

    if requirement is only variables as a params then try this

    setTimeout((param1,param2) => { alert(param1 + param2) },2000,'msg1', 'msg2')

    You can try this with ES5 and ES6

    0 讨论(0)
提交回复
热议问题