`
blueyanghualong
  • 浏览: 225289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

setTimeout与setInterval在不同浏览器下的差异

阅读更多
setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时或延时调用一个函数或一段代码。
(新手可能认为setTimeout与setInterval是javascript函数,这是错误的。新手容易将javascript对象函数与DOM对象方法混淆。)

先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢?
function f(){
    var s = 'arguments.length:'+arguments.length+'; ';
    for(var i=0,n=arguments.length;i< n;i++){
        s += ' ['+i+']:'+arguments[i]+'; ';
    }
    alert(s);
}
setTimeout(f,500,"javascript","AAA")

我这里要探讨的,不是什么时候该用哪一个,而是探讨这两个方法在各浏览器中的差异。

原先我一直没觉得这两个方法会有什么乌龙,一个偶然的机会让我得知了,现在整理一下写出来和大家分享。

因为setTimeout与setInterval的参数和用法是一样的,只是功能不同,所以,为了省事,我下面只以setTimeout为例进行说明以及举例。

setTimeout被最经常用到的形式大概是如下2种样子的:

    iTimerID = setTimeout(strJsCode, 50)   //strJsCode为一个包含 js代码的字符串
    iTimerID = setTimeout(objFunction, 50) //objFunction为一个函数对象

第一种调用方式是传包含js代码的字符串,这种方式的好处是简洁,但坏处是运行效率差,而且不利于语法解析,有潜在风险,更重要的是,处理比较复杂的内容比较费劲,这一点和eval的弊端是一致的。
所以,我们认为,通常应当采用第二种方式调用为好。(后面我的例子均采用第2种调用方式)


现在来揭晓开头那一段代码在各种浏览器下的结果:
    IE(6,7,8)是: arguments.length:0;
    Opera(6,7,8)是: arguments.length:2;  [0]:javascript;  [1]:AAA;
    Firefox(3.0)是: arguments.length:3;  [0]:javascript;  [1]:AAA;  [2]:-15;
竟然有这么大的差别,还真是“你唱你的曲,我哼我的调”!
Firefox(3.0)下,得出的最后一个数字是不特定的,有时候是0,有时候是一个负数,这问题后面再说。


(一)IE系列中的setTimeout

首先,我们看看微软出的DHTML参考手册中是如何说的:

setTimeout Method
    Evaluates an expression after a specified number of milliseconds has elapsed.

Syntax
    iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])

Parameters
    vCode               Required. Variant that specifies the function pointer or string that indicates
                                    the code to be executed when the specified interval has elapsed.
    iMilliSeconds     Required. Integer that specifies the number of milliseconds.
    sLanguage       Optional. String that specifies one of the following values:
                                  JScript Language is JScript.
                                  VBScript Language is VBScript.
                                  JavaScript Language is JavaScript.

MSDN上关于setTimeout的说明:
        http://msdn.microsoft.com/en-us/library/ms536753(VS.85).aspx

也就是说,setTimeout接收3个参数,第3个参数表示脚本语言的类型,如果你再传入更多的参数,是无意义的。
因此,在IE中,以下两种都是对的。
        setTimeout('alert(1)', 50);

        setTimeout('msgbox "终止、重试、忽略,您看着办吧。", vbAbortRetryIgnore + vbDefaultButton2, "告诉您"', 50, 'VBScript');


(二)Mozilla系列中的setTimeout

我们看看Mozilla官方网站上 Gecko DOM Reference 手册中是如何说的:
window.setTimeout
    Summary
        Executes a code snippet or a function after specified delay.

    Syntax
        var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
        var timeoutID = window.setTimeout(code, delay);

前两个参数都一样,没差别,从第三个参数就不同了。
因为目前只有IE浏览器支持多种语言的脚本,其它浏览器只支持js脚本所以不需要传语言类型的参数。
Mozilla把传给setTimeout的第3个以及更后面的更多参数依次的传给前面的func做为参数。
Firefox, Opera, Safari, Chrome等等也都是如此。

但是注意到,Mozilla上说了他家的setTimeout有一个叫做"Lateness" argument的BUG.
        "Lateness" argument
                Functions invoked by setTimeout are passed an extra "lateness" argument in Mozilla,
                i.e., the lateness of the timeout in milliseconds. (See bug 10637 and bug 394769.)
这就是开头那个例子中,Firefox(3.0)下有一个乌龙数字的根源。

Mozilla上关于setTimeout的说明:
        https://developer.mozilla.org/en/DOM/window.setTimeout

(三)其它浏览器系列(Opera, Safari, Chrome)中的setTimeout
    和Mozilla系列中的基本一样,但是没有Mozilla系列中的多一个参数的BUG.


武林外传:使用setTimeout的小技巧

    (1)IE中给setTimeout中的调用函数传参数
        上面的分析可知,IE是不支持在setTimeout中给被调用的函数传参数的,为了浏览器世界的和谐,我们可以把函数调用参数包裹进新的匿名函数中。示例:
            function f(a){
                alert(a);
            }
            // setTimeout(f,50,'hello'); //用于非IE
            setTimeout(function(){f('hello')},50); //通用
            var str='hello';
            setTimeout(function(){f(str)},50); //通用

    (2)this问题
        setTimeout调用的函数被执行时的上下文是全局,而不再是调用setTimeout方法时的上下文。所以,setTimeout的第一个参数的函数被执行时其this是指向window的,如果需要保留调用setTimeout方法时的this,就需要把当时的this传进去。示例:
            function Person(name){
                this.name=name;
                var f=function(){alert('My name is '+this.name)};

                // setTimeout(f,50); //错误

                var THIS=this;
                setTimeout(function(){f.apply(THIS)},50); //正确,通用
                setTimeout(function(){f.call(THIS)},50); //正确,通用
            }
            new Person('Jack');

要说的就这些了。
发帖子不是脑力活,其实是体力活,组织文字,写例子,排版,这些没技术含量的事情是最累人最耗时间的。
分享到:
评论

相关推荐

    2008-2020年 中国老年人健康长寿影响因素调查(CLHLS).zip

    中国健康与养老追踪调查CHARLS是一项大型、跨学科的追踪调查项目,旨在收集中国老年人的健康、经济、社会和心理等多方面的信息。 一方面,随着医疗技术的进步和生活水平的提高,越来越多的老年人享受着健康长寿的生活;另一方面,慢性病、失能等健康问题仍然困扰着部分老年人,对他们的生活质量产生了严重影响。 数据年份:2020/2018/2015/2014/2013/2012/2011/2008 追访问卷、用户手册、原始数据等等 2008年两省试调查 2011年全国基线调查 2012年两省追踪调查 2013年全国追踪调查 2014年全国追踪调查(生命历程调查) 2015年全国追踪调查 2018年全国追踪调查 2020年全国追踪调查 Harmonized CHARLS

    基于java的削面快餐店点餐服务系统的设计与实现.docx

    基于java的削面快餐店点餐服务系统的设计与实现.docx

    这是一款基于AR增强现实的APP,包含AR导航,AR标签显示,AR足迹功能(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    基于java的网上办公自动化系统设计与实现.docx

    基于java的网上办公自动化系统设计与实现.docx

    Chrome 开阔绿地草地主题Canola Flower .zip

    Chrome主题-开阔绿地草地主题

    购物商城项目采用PHP+mysql有以及html+css jq等(毕设&课设&实训&大作业&竞赛&项目)

    购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    小程序&预约报名&家政预约(源码+截图+源码导入教程和视频).zip

    小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&预约报名&家政预约(源码+截图+源码导入教程和视频) 小程序&

    python贪吃蛇游戏

    python贪吃蛇游戏

    基于java Swing+mysql实现简单的购物系统项目(说明文档+视频+源码)

    【作品名称】:基于java Swing+mysql实现简单的购物系统项目(说明文档+视频+源码) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:由Java swing实现的一款简单的购物程序,数据库采用的是mysql,该项目非常简单,实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能,旨在学习Java 图形界面开发,所以非常适合Java初学者和学生用来学习参考,下面我们来看看如何配置运行; 将项目导入到eclipse(myeclipse也可以) 2.将项目导入后需要进行必要的配置才可以运行,接下来我演示如何配置。 3.接下来配置数据库连接信息,在dbutil里面配置数据库信息。 4.接下来我们来导入数据库文件,采用的是navicat数据库管理工具,如果你 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。

    中低压蒸汽锅炉补水可以用自来水替代软化水或除盐水

    中低压蒸汽锅炉用户使用市政自来水+多效能BF防腐阻垢剂替代软化水或除盐水+阻垢+除氧+调PH值操作,不仅能大幅节省水资源、工业盐、电力、人力,消耗材料,实现节能减排,降本增效,防止地下水资源被污染,保护环境;还能有效解决有效防止锅炉水系统的腐蚀、结垢、失水量大、运行成本高等老大难问题。

    机器学习、深度学习的学习路径及知识总结

    数学基础:包括微积分、线性代数、概率论等对理解机器学习算法有帮助的基本数学。 Python:Python提供了非常丰富的工具包,非常适合学习者实现算法,也可以完成工业环境项目。作为主流的深度学习框架,例如当前最流行的两个AI框架TensorFlow、PyTorch都以Python作为语言首选。另外,主流的在线课程(比如Andrew Ng在Coursera的深度学习系列课程)用Python作为练习项目的语言。在这部分,我将包括Python语言基础和机器学习常用的几个库,包括Numpy、Pandas、matplotlib、Scikit-Learn等。 机器学习:介绍主流的机器学习算法,比如线性回归、逻辑回归、神经网络、SVM、PCA、加权算法等等。 深度学习:介绍原理和常见的模型(如CNN、RNN、LSTM、GAN等)和深度学习的框架(TensorFlow、Keras、PyTorch)。 强化学习:介绍强化学习的简单原理和实例。 实践项目:这里将结合几个实际项目的演示比较完整的讲解。另外结合Kaggle、阿里云天池演示演示。 阅读论文:如果你追求更高、更深入的研究时,看深度学习各细分领域的

    c语言文件读写操作详细教程和源代码带注释.txt

    c 在C++中,有许多经典程序示例,可以用于学习和实践。下面是一个简单的示例,演示了如何使用C++标准库中的输入输出流(iostream)进行基本的输入输出操作。 示例:Hello, World! 程序 #include <iostream> // 引入输入输出流库 int main() { std::cout << "Hello, World!" << std::endl; // 输出 "Hello, World!" 到控制台 return 0; // 程序执行成功 } ### 示例:加法计算器 #include <iostream> int main() { int num1, num2, sum; // 提示用户输入两个整数 std::cout << "Enter two integers to add: "; std::cin >> num1 >> num2; // 从标准输入读取两个整数 // 计算和 sum = num1 + num2; // 输出结果 std::cout << "Th

    java-ssm+vue校园快递快领服务系统实现源码(项目源码-说明文档)

    管理员登录,通过填写用户名、密码、权限等信息,输入完成后选择登录即可进入校园快领服务系统 管理员登录进入校园快领服务系统可以查看首页、个人中心、快递员管理、学生管理、快递信息管理、取货信息管理、订单信息管理、接单信息管理、服务评价管理、订单投诉管理、留言板管理、论坛管理、系统管理等内容 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    基于SSH源码,升级ssm源码官网,业务上有所增强.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    HFSS-MATLAB-API工具库

    HFSS-MATLAB-API工具库及使用实例——矩形微带贴片模型

    基于java的的个人博客网站的设计与实现设计与实现.docx

    基于java的的个人博客网站的设计与实现设计与实现.docx

    #_ssm_138_mysql_学生选课管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    java-ssm+vue医院住院管理系统实现源码(项目源码-说明文档)

    预约住院系统,用户就可以在网上预约医院的专家、专科号。它能更好的改善就医环境,简化就医环节,节约就医时间,真正体现了以病人为中心,切从方便患者出发,符合当今医院人性化温馨服务的理念。本医院住院管理系统采用的数据库是Mysql,使用SSM框架开发。 医院住院管理系统,在医院住院管理系统首页可以查看首页、医护人员、药品信息、健康讲坛、个人中心、后台管理、医疗交流等内容 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    毕业设计-大数据Spark平台的在线性能检测与调优.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java的民宿住宿管理系统设计与实现.docx

    基于java的民宿住宿管理系统设计与实现.docx

Global site tag (gtag.js) - Google Analytics