设为首页 收藏本站
查看: 1122|回复: 0

[经验分享] 让JavaScript中计时器setTimeout/setInterval的回调方法支持参数传递

[复制链接]

尚未签到

发表于 2017-2-23 09:13:58 | 显示全部楼层 |阅读模式
1. 背景
  在JavaScript中,我们经常要用到Timer,也就是setTimeout或者setInterval这两个方法。例如:

var t1 = setTimeout(function() {
//TODO: add your logic here
}, 1000);
  同时,我们也经常听到有人报怨说里面的这个回调方法不支持参数传递。有时候,我们想要在里面的function里面用到外部的数据时,只能在外面定义一个变量,如下:

var i = 0;
setTimeout(function() {
alert(i);
}, 1000);
  那么,我们如果能够里面这个function支持参数传递,是不是感觉要好点呢?比如写成这样[1]:

setTimeout(function(msg) {
alert(msg); //显示 Hello, world!
}, 1000, 'Hello, world!');
2. 初试
  笔者突发奇想地试着将上述代码放到浏览器里面执行了一下:

<!DOCTYPE HTML>
<html>
<head>
<title>JavaScript Timer Args Test</title>
</head>
<body>
<script type="text/javascript">
(function(){
setTimeout(function(msg) {
alert(msg); //显示 Hello, world!
}, 1000, 'Hello, world!');
})();
</script>
</body>
</html>
  令人惊喜的事,这段代码在Firefox 4.0, Chrome 11, Safari 5.0里面尽然能够成功的执行,弹出了Hello, world!  在IE9 中弹出的则是undefined!
DSC0000.gif


3. 兼容IE
  时至此刻,要想在IE下也能使用,就只有替换掉IE内置的setTimeout/setInterval方法了。如下:

/**
* @author Hyacinthus ·风信子·
*/
(function(){ // reset timer for IE
if (navigator.appName == 'Microsoft Internet Explorer') {
var _preTimeout = window.setTimeout, _preInterval = window.setInterval;
window.setTimeout = function(callback, after){
var l = arguments.length;
if (l > 2) {
var args = [];
for (var i = 2; i < l; i++) {
args.push(arguments);
}
return _preTimeout(function(){
callback.apply(this, args);
}, after); //记得返回timer id
}
else {
return _preTimeout.apply(this, arguments);
}
}
window.setInterval = function(callback, cycle){
var l = arguments.length;
if (l > 2) {
var args = [];
for (var i = 2; i < l; i++) {
args.push(arguments);
}
return _preInterval(function(){
callback.apply(this, args);
}, cycle);
}
else {
return _preInterval.apply(this, arguments);
}
}
}
})();
4. 结语
  一些比较现代的浏览器都支持js在timer的回调函数中传入参数,只是一般不为人知而已(个人感觉这种写法以后会成为js中的标准)。
  希望本文对您有帮助!
  最后附上完整的HTML文件,任您把玩!》点击此处《
  注:[1]. 参考自NodeJs中的setTimeout语法 setTimeout(callback, delay, [arg], [...])  http://nodejs.org/docs/v0.4.5/api/timers.html


作者: ·风信子·  
出处: http://www.cnblogs.com/lingcooler  
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-345962-1-1.html 上篇帖子: web前端学习路线与书籍推荐 下篇帖子: 开发技术文档汇总
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表