一、setTimeout基础
setTimeout(func|code,delay);
第一个参数表示将要推迟的函数名或者一段代码,第二个参数表示推迟执行的毫秒数
 
eg:
console.log();
setTimeout('console.log(2)',);
console.log(); answer:
 
*:推迟的代码必须以字符串的形式,因为引擎内部使用eval()函数,将字符串转为代码。
*:如果推迟执行的是函数,则可以直接将函数名,放入setTimeout()
 
eg:
function func(){
  console.log();
}
setTimeout(func,);
//或者
setTimeout(function(){
  console.log();
},)

*:如果写成setTimeout(func(),5000);func会立即执行

二、setTimeout支持更多的参数
eg:
setTimeout(function(a,b){
  console.log(a+b);
},1000,4,5) //4,5 9
//'str' '2' str2
 
*:从第三个参数开始,依次用来表示第一个参数(回调函数)传入的参数
*:一些古老的浏览器是不支持,可以用bind或apply方法来解决
 
eg:
setTimeout(function(a,b){
  console.log(a+b);
}.bind(this,4,5),1000)
 
*:第一个参数表示将原函数的this绑定全局作用域,第二个参数开始是要传入原函数的参数
*:当调用绑定函数时,绑定函数会以创建它时传入bind()方法的第一个参数作为 this
 
三、setTimeout()中回调函数中的this
eg:
var a=1;
var obj={
  a:2,
  b:function(){
    setTimeout(function(){
      console.log(this.a);
    },2000);
  }
};
obj.b();
 
上面代码输出的是1,而不是2,表示o.b的this所指向的已经不是o,而是全局环境了
可以用bind()来改变这个情况:
 
var a=1;
var obj={
a:2,
b:function(){
setTimeout(function(){
console.log(this.a);
}.bind(this),2000);//注意这行
}
};
obj.b();
四、setTimeout()执行回调间隔时间长度
 
var startTime = new Date();
setTimeout(function () {
console.log(new Date() - startTime);
}, 100);
 
//100+ 取决于后面同步执行的JS需要占用多少时间
 
 
五、setTimeout(func,0)
eg:func1和func2谁会先执行?

function func1(){
console.log(1);
}
function func2(){
console.log(2);
}
setTimeout(function () {
func1();
}, 0)
func2();
setTimeout(function(){
func1()
},0)
setTimeout(function(){
func1();
})

有什么差别?

0秒延迟,此回调将会放到一个能立即执行的时段进行触发。javascript代码大体上是自顶向下的,但中间穿插着有关DOM渲染,事件回应等异步代码,他们将组成一个队列,零秒延迟将会实现插队操作。
不写第二个参数,浏览器自动配置时间,在IE,FireFox中,第一次配可能给个很大的数字,100ms上下,往后会缩小到最小时间间隔,Safari,chrome,opera则多为10ms上下。
 
 
 
六、setTimeout和单线程
首先需要注意javascript是单线程的,特点就是容易出现阻塞。如果一段程序处理时间很长,很容易导致整个页面hold住。什么交互都处理不了怎么办?
setTimeout一个很关键的用法就是分片,如果一段程序过大,我们可以拆分成若干细小的块。
例如上面的情况,我们将那一段复杂的逻辑拆分处理,分片塞入队列。这样即使在复杂程序没有处理完时,
我们操作页面,也是能得到即使响应的。其实就是将交互插入到了复杂程序中执行。
换一种思路,上面就是利用setTimeout实现一种伪多线程的概念
有个函数库Concurrent.Thread.js 就是实现js的多线程的
eg:Concurrent.Thread.create(function(){
for(var i=0; i<100000000; i++){
console.log(i);
}
}) $('#test').click(function(){
alert(1);
});
虽然有个巨大的循环,但是这时不妨碍你去触发alert();
当我们需要渲染一个很复杂的DOM时,例如table组件,复杂的构图等等,
假如整个过程需要3s,我们是等待完全处理完成在呈现,还是使用一个setTimeout分片,
将内容一片一片的断续呈现。
其实setTimeout给了我们很多优化交互的空间。
 
 
七、如何使用
setTimeout这么厉害,那么我们是需要在在项目中大量使用吗?
我这边的观点是非常不建议,在我们业务中,基本上是禁止在业务逻辑中使用setTimeout的
例如,当一个实例还没有初始化的前,我们就使用这个实例,错误的解决办法是使用实例时加个setTimeout,确保实例先初始化。
为什么错误?这里其实就是使用hack的手段
第一是埋下了坑,打乱模块的生命周期
第二是出现问题时,setTimeout其实是很难调试的。
综上,setTimeout其实想用好还是很困难的,时间的不确定性,排队运算混乱, 他更多的出现是在框架和类库中,例如一些实现Promis的框架,就用上了setTimeout去实现异步。

setTimeout详解的更多相关文章

  1. JS中的window.setTimeout()详解

    相关用法: setTimeout (表达式,延时时间)setInterval (表达式,交互时间)其中延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTimeout 在执行时,是在载入 ...

  2. setInterval setTimeout 详解

    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( ...

  3. 关于setTimeout()你所不知道的地方,详解setTimeout()

    关于setTimeout()你所不知道的地方,详解setTimeout() 前言:看了这篇文章,1.注意setTimeout引用的是全部变量还是局部变量了,当直接调用外部函数方法时,实际上函数内部的变 ...

  4. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  5. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  6. Window 对象详解 转自 http://blog.csdn.net/jcx5083761/article/details/41243697

    详解HTML中的window对象和document对象 标签: HTMLwindowdocument 2014-11-18 11:03 5884人阅读 评论(0) 收藏 举报 分类: HTML& ...

  7. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  8. JS魔法堂:LINK元素深入详解

    一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css&quo ...

  9. HTML滚动字幕代码参数详解及Js间隔滚动代码

    html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...

随机推荐

  1. linux下WordPress安装

    http://www.cnblogs.com/xiaofengkang/ WordPress简介 WordPress 是一种使用 PHP语言和 MySQL数据库开发的开源.免费的Blog(博客,网志) ...

  2. mc02_配置本地git仓库并上传到github

    注册github账号 仔细阅读使用说明便可,这里提一下如何删除一个repository. 点击要删除的repository,打开后点击Settings 然后滚动到页面最下方,点击最后一个按钮 在弹出框 ...

  3. CSS动态伪类选择器温故

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

  4. windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变

    # 原因:因为%SystemRoot%\system32 在引用这个环境变量时,会默认C:\Windows\System32下的jdk版本 # 解决方法: 把jdk的配置放在path前面就可以了

  5. [转]理解js中的原型链,prototype与__proto__的关系

    本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...

  6. php和c++socket通讯(基于字节流,二进制)

    研究了一下PHP和C++socket通讯,用C++作为服务器端,php作为客户端进行. socket通讯是基于协议的,因此,只要双方协议一致就行. 关于协议的选择:我看过网上大部分协议都是在应用层的协 ...

  7. python 中文分词:结巴分词

    中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词.其基本实现原理有三点: 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 采用了动态规 ...

  8. Python源码读后小结

    Python 笔记 前言(还是叫杂记吧) 在python中一切皆对象, python中的对象体系大致包含了"类型对象", "Mapping对象(dict)", ...

  9. node搭环境

    node是javascript的运行环境,npm是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等). 一.安装node 1.在https://nodejs.org/en/do ...

  10. phoneGap异步加载JS失败

    现在正在做一个phoneGap项目,安卓平台,有个异步加载JS总是失败,phoneGap也不好调试,一个问题纠结了一下午 最后找了半天,找到了原因,因此写本文记录一下,也顺便帮帮遇到同样问题的人 原因 ...