JavaScript中window.setTimeout方法大家想必不陌生,各位慕友可能经常需要用到这个方法。但是今天我百度“在第一个参数为函数名时如何给该函数传入参数”时发现大家有很多解决方式,这些方式有好有坏,我在这里做一点小小的总结,同时方便自己后续查看。
下面直接进入正题(没错,我就是这么直接):
方法一、如果仅需要在IE 9+进行开发,window.setTimeout支持setTimeout(function f,unsigned long timeout, any args...)方式调用。我解释一下各个参数的意思:第一个参数是需要传入的被调用的函数;第二个参数是等待的毫秒数;而后面的所有参数都将作为第一个参数运行时的参数传入。说的有点绕啊,就是第二个参数之后的参数就是你传给函数f调用的参数。所以如何给延时调用的函数传参数?直接在第二个参数之后输入就行了。什么,你问我IE 9及以下的浏览器怎么办?IE 9及以下的浏览器只支持
setTimeout(function f,unsigned long timeout)
方式调用(我也很绝望啊、、、)。当然,办法还是能找到滴,请看第三条。但是这么麻烦你指望我用?所以IE 10及以下直接忽略这个方法吧。什么?你说非得兼容?那么请往下看、、、
方法二、一个网上常见的方法——将函数名用引号包裹起来,就像这样
setTimeout ("getProgress(" + args + ")", 3000)
这个方法为什么管用呢?这就是历史遗留问题了。
由于历史原因,setTimeout和setInterval的第一个参数可以作为字符串传入。如果这样做,那么这个字符串会在指定时间之后进行求值(相当于执行eval())。——JavaScript权威指南(中文第六版 P342)
也就是说其实是把这个传入函数的执行给“冻结”(我自己想的名词)了。等到春暖花开,额,走错了片场,是等到指定的时间一到,我“胡汉三又回来啦”,又走错了片场,是setTimeout方法就对这个字符串进行解析。然后发现:咦,这怎么是一个函数调用表达式(关于函数调用表达式请自行百度),最后执行这个函数调用表达式(setTimeout方法内心活动:好气啊,我为什么要做这种事),然后就实现了给函数f传入参数。大家有没有发现关键词,是“相当于执行eval()”啊,eval是什么啊,eval是魔鬼啊,所以,这个方法real不推荐、、、
方法三、下面咱们来聊一聊好用又简单,还不用和魔鬼交易的方法——匿名函数包装。
就是像下面这样:
setTimeout(function(){f(args)},unsigned long timeout);
怎样,是不是很简单。这里基本原理就是利用一个不需要参数的匿名函数作为被调用的函数。当这个匿名函数被调用时执行需要传入参数的函数f,间接实现函数f被延迟调用。这里推荐使用这种方法(你非得使用方法二我也拦不住啊)。
这次就先写到这了。如果各位看官有什么建议可以在下面提,当然采不采纳得看我心情了(没错,就是这么傲娇)。如果有什么错误更加可以指出来(改?开玩笑,我怎么可能会出错,我只是考验你罢了。),我会虚心接受(我是认真 的)。
谢谢各位百忙之中抽空出来阅读本文,如果不忙,点个赞再走呗、、、
热门评论
前排瓜子板凳出售、、、