您的位置:首页 > Web前端 > JavaScript

js setTimeOut() 方法传参

2014-10-14 17:24 381 查看
转载出自:http://blog.csdn.net/caicai0328/article/details/7715321

在javascript编程中常用到setTimeout函数定时执行某函数,可在给函数传参时容易出现问题,这里是自己在工作过程中的总结:

1、采用字符串

setTimeout("start(" + argu + ")",1000)

此方法用于传递字符串,无法传递对象

2、匿名函数

setTimeout(function(){ start(argu)},1000); 调用start函数并传arg参数

字符串、对象都行

3、在有些情况下需在循环中使用,如:

window.onload=function(){

       var a=[{id:1},{id:2},{id:3},{id:4}];

       for(var i=0;i<3;i++){

           setTimeout(function(){start(a[i])},1000);

       }

}

function start(obj){ alert(obj.id);}

输出的结果都为 4。因为在一个函数体中,a和i相对于匿名函数是全局的,循环执行完后i=3 ,都执行start(a[3]),所以输出结果相同。

这种情况怎么解决呢,只需把setTimeout封装到一个函数中即可

window.onload=function(){

       var a=[{id:1},{id:2},{id:3},{id:4}];

       for(var i=0;i<3;i++){

            set(a[i]);

       }

}

function set(obj){   setTimeout(function(){start(obj)},1000);   }

obj和匿名函数在同一作用域,所以在匿名函数中可以直接访问obj,而且每次执行setTimeout时都会产生新的匿名函数体和作用域,所以定时执行匿名函数时调用start并传值就不会出问题了。(此为个人的理解,不一定正确)

function start(obj){ alert(obj.id);}

在网上看到有人封装了一个函数,也可实现该功能

var util={

setTimeout:function(fun, delay) {

    if(typeof fun == 'function'){

      var argu = Array.prototype.slice.call(arguments,2);

       var f = (function(){

      fun.apply(null, argu);

      }

    );

     return window.setTimeout(f, delay);

   }

   return window.setTimeout(fun,delay);

}

}

window.onload=function(){

       var a=[{id:1},{id:2},{id:3},{id:4}];

       for(var i=0;i<3;i++){

             util.setTimeout(start,1000,a[i]);

       }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: