本文介绍一种在使用异步函数setTimeout时给其带上参数的方法。

写这篇文章的时候,在高级浏览器比如Google Chrome上,setTimeout已经支持带第二个以外的参数,而且IE10 、IE11也是可以的,效果如下所示:

IE9以及以下,还不支持:

针对这种情况,其实也有解决办法的,思路就是重写setTimeout方法。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>settimeout</title>
</head>
<body><div id="root"></div><script type="text/javascript">function add(a,b){return a + b;}var __sto = setTimeout;window.setTimeout = function(callback,timeout,param){var args = Array.prototype.slice.call(arguments,2);var _cb = function(){callback.apply(null,args);}__sto(_cb,timeout);}window.onload = function(){window.setTimeout(function(a,b){console.log("a + b = ",add(a,b))},1000,3,5);}</script>
</body>
</html>

上面这段在HTML文件中的<script></script>部分重新定义setTimeout的做法就可以解决ie9以及以下版本中传参数的问题。运行效果如下所示:

如果去掉重写setTimeout的部分,结果如下所示:

这段代码的核心就在这里:

var __sto = setTimeout;
window.setTimeout = function(callback,timeout,param){var args = Array.prototype.slice.call(arguments,2);var _cb = function(){callback.apply(null,args);}__sto(_cb,timeout);
}

重写的时候,给原来的函数取个别名,虽然用不了第二个以外的参数,但是它还是可以传进来的,我们就把它取出来,传递到回调函数中,再调用回调函数,这样就解决了传参问题。

这种办法虽然是一种兼容的办法,但是它破坏了其他浏览器原生setTimeout的方法,看似很好,其实也有一点不好。

其实对于IE浏览器的版本问题,我们还有一种使用IE条件注释判断表达式判断浏览器版本的办法,将重写代码放入HTML中,只有IE浏览器才能识别并起作用。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>settimeout</title>
</head>
<body><div id="root"></div><!--[if lte IE 9]><script>(function(f){window.setTimeout=f(window.setTimeout);window.setInterval=f(window.setInterval);})(function(f){return function(c,t){var a=[].slice.call(arguments,2);return f(function(){c instanceof Function?c.apply(this,a):eval(c)},t)}});</script><![endif]--><script type="text/javascript">function add(a,b){return a + b;}window.onload = function(){setTimeout(function(a,b){console.log("a + b = ",add(a,b))},1000,3,5);}</script>
</body>
</html>

这种办法的好处就是对于IE内核之外的浏览器,它可以直接使用native的setTimeout。缺点就是他嵌入了HTML中,不能与HTML分离,在大型项目中,需要放在一个全局的HTML页面中,才能不至于哪哪都要加这段代码。

JavaScript:如何给setTimeout传递参数相关推荐

  1. JavaScript为事件处理器传递参数 (转)

    首先参考:javascript attachEvent和addEventListener 使用方法 attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEve ...

  2. linux的 定时器传参数,JavaScript 定时器调用传递参数的方法

    JavaScript定时器调用传递参数的方法,需要的朋友可以参考下. 无论是window.setTimeout 还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,而在许 ...

  3. JavaScript setTimeout用法,js setTimeout带参数

    JavaScript setTimeout用法,js setTimeout带参数 ================================ ©Copyright 蕃薯耀 2021-07-07 ...

  4. 静态html页面传递参数,javascript静态页面传值的三种方法分享

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm function Post() { //单个值 Read.htm?username=b ...

  5. js setTimeout 传递带参数的函数的2种方式

    js setTimeout 传递带参数的函数的2种方式 Created by Marydon on 2018年9月14日 1.准备工作 function sayYourName(param) {ale ...

  6. 关于javaScript注册事件传递参数的浅析

    最近这半年作为一个java 程序员,我写的javaScript代码都快比java代码多了,前段时间是给某银行做一个柜员管控系统,在柜员授权这一块功能上,由于柜员的授权需要考虑各方面的因素,比如机构权限 ...

  7. 如何使用定时器settimeout、setInterval执行能传递参数的函数(转)

    来自: http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html var userName="jack"; //根 ...

  8. javascript写的关于静态页面获取URL传递参数的函数[原创]

    2005.04.29发表于blog.csdn.net/zxub 昨天搬家居然忘搬这篇文章了,郁闷~ 以前写了关于静态页面刷新后,跳转菜单定位的函数,前几天没事看了看,感觉还是有点问题,通用性不好,所以 ...

  9. html iframe 传递数据,javascript – 如何通过iframe从父HTML传递参数?

    在主页上简单地传递参数如下 function myFunction(){ $('#myIframe').attr('src',"myIframeRequest.html?param1=val ...

最新文章

  1. 时间字符串与当前时间比較
  2. python web框架介绍对比
  3. python与excel的差别-python3与Excel的完美结合
  4. 《系统集成项目管理工程师》必背100个知识点-43项目成本控制的主要内容
  5. 视频前初步认识UML
  6. libsvm工具箱会和matlab,MATLAB实现多分类和libsvm工具箱的安装使用详解
  7. AUTOSAR从入门到精通100讲(五)-汽车LIN总线详解
  8. 终于找到了。 图标搜索、UI设计、移动开发集中导航
  9. android压缩图片,并将其转化成base64提交到服务器
  10. 虚点连边 分层最短路
  11. html页面 request,HTML DOM requestFullscreen() 方法
  12. 身份证号校验、身份证照片解析(百度API)
  13. IPM是如何控制三相电机的
  14. mpg文件怎么转换成mp4
  15. AutoSAR系列讲解(深入篇)14.2-Mcal Port配置
  16. UVM寄存器模型:reg adapter实现和集成
  17. 网络基础--TCP/IP网络基础
  18. 《人性的弱点》【美】戴尔 卡耐基 读书笔记
  19. 【数字图像处理】【个人入门记录】 绪论
  20. 神经网络权重是什么意思,神经网络权重调整方法

热门文章

  1. H5之vue3+高德地图api
  2. 群星怎么让服务器稳定,群星快速升科技方法 让电脑回防技巧
  3. matlab实现子载波分配,一种lte上行链路分步式动态子载波分配方法
  4. redis队列生产消费php,redis 队列 生产者 消费者模式
  5. 记录一次修改sga大小之后出现的一系列报错
  6. vivoY31s和OPPOA72哪个好
  7. 《英文观止》第一章~第九章笔记和翻译
  8. PPT自动保存%撤销次数%快捷键
  9. linux用冒泡排序程序,冒泡排序 Linux下c 实现
  10. 暗流涌动的智能家居,和顺势已飞的三翼鸟