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

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

I have some JavaScript code that looks like:

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


        
28条回答
  •  梦如初夏
    2020-11-21 07:58

    I recently came across the unique situation of needing to use a setTimeout in a loop. Understanding this can help you understand how to pass parameters to setTimeout.

    Method 1

    Use forEach and Object.keys, as per Sukima's suggestion:

    var testObject = {
        prop1: 'test1',
        prop2: 'test2',
        prop3: 'test3'
    };
    
    Object.keys(testObject).forEach(function(propertyName, i) {
        setTimeout(function() {
            console.log(testObject[propertyName]);
        }, i * 1000);
    });
    

    I recommend this method.

    Method 2

    Use bind:

    var i = 0;
    for (var propertyName in testObject) {
        setTimeout(function(propertyName) {
            console.log(testObject[propertyName]);
        }.bind(this, propertyName), i++ * 1000);
    }
    

    JSFiddle: http://jsfiddle.net/MsBkW/

    Method 3

    Or if you can't use forEach or bind, use an IIFE:

    var i = 0;
    for (var propertyName in testObject) {
        setTimeout((function(propertyName) {
            return function() {
                console.log(testObject[propertyName]);
            };
        })(propertyName), i++ * 1000);
    }
    

    Method 4

    But if you don't care about IE < 10, then you could use Fabio's suggestion:

    var i = 0;
    for (var propertyName in testObject) {
        setTimeout(function(propertyName) {
            console.log(testObject[propertyName]);
        }, i++ * 1000, propertyName);
    }
    

    Method 5 (ES6)

    Use a block scoped variable:

    let i = 0;
    for (let propertyName in testObject) {
        setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
    }
    

    Though I would still recommend using Object.keys with forEach in ES6.

提交回复
热议问题