《JavaScript权威指南》第四版中说“window对象方法setTimeout()用来安排一个JavaScript的代码段在将来的某个指定时间运行”。

setTimeout(foo,i); // foo是回调函数,i是延时时间

注意“将来”一词,setTime会把foo函数放到队列中,当线程空闲的时候,JavaScript才会去执行队列里的事件。

看下面的代码:

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript"> window.onload = function () {
var a = 0;
function one() {
for (var i = 0; i < 10; i++) {
console.log(i);
setTimeout(function(){
console.log(a);
a += i; },0);
}; }
function two() {
alert(a);
}
one();
setTimeout(two,0);
}
</script>
</head>
</html>

这里其实one函数看着像是会正常把a从0加到9,然后alert出来。

但实际上的alert结果是100,为什么?

one函数的for循环是不会因为setTimeout停下的,它遇到setTimeout的时候只会把里面的回调函数放到队列里面去,然后继续i++。等执行完所有的for循环才会去执行刚才放到队列的函数。因为循环完了所以i是10,总共有10个相同的a+=i;操作的函数被调用,最后a的结果就变成了100了。

但是其实上面代码有部分我还是不明白,就是如果setTimeout(two,0);改成setTimeout(two(),0);的话,alert的结果就变成了0

setTimeout的第一个参数是函数对象,如果变成two(),那回调函数就变成了two的返回值,因为需要用到two的返回值,two函数就会直接执行,在执行的时候a没有发生任何变化,所以输出就是0了。

附上setTimeout不带参数的一些写法:

setTimeout("alert('3秒后执行我')",3000);                          // 直接把执行语句放在双引号里当参数

setTimeout(function(){alert("3秒后执行我");},3000);               // 直接把一个包含执行语句的匿名函数当参数

setTimeout(two,3000);                                           // 把指针当参数

setTimeout("two()",3000);                                      // 把two()函数放在双引号里当参数,相当于用eval()函数来解析他

setTimeout(function(){two();},3000);                           // 把要执行的函数放在一个匿名函数里当参数

带参数的写法:

setTimeout("two('"+arg1+"',"+"'"+arg2+"',"+....+"')",3000);           // 尽量不要用这一样,很容易弄错

setTimeout(two,3000,arg1,arg2....);                                  // 第一个参数是指针,第二个是延迟执行的时间,后面紧跟着的是调用函数所执行的参数

setTimeout(function(){two(arg1,arg2...);},3000);                     // 直接把要执行的函数已经参数放在匿名函数里当setTimeout的第一个参数

JavaScript学习之setTimeout的更多相关文章

  1. JavaScript学习笔记-setTimeout应用

    setTimeout应用 var ids = [];function foo1(i) { this.i = i; console.log('i = '+i); ids[0] = setTimeout( ...

  2. JavaScript学习之 倒计时

    倒计时很常见,例如离XX活动还有XX天XX小时XX分XX秒,然后逐秒减少,实现很简单,我只是想记录这过程中的一点小坑. 先上代码: <html> <head> <meta ...

  3. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  4. JavaScript学习05 定时器

    JavaScript学习05 定时器 定时器1 用以指定在一段特定的时间后执行某段程序. setTimeout(): 格式:[定时器对象名=] setTimeout(“<表达式>”,毫秒) ...

  5. Javascript学习7 - 脚本化浏览器窗口

    原文:Javascript学习7 - 脚本化浏览器窗口 本节讨论了文档对象模型.客户端Javascript下Window中的各项属性,包括计时器.Location对象.Histroy对象.窗口.浏览器 ...

  6. JavaScript学习记录四

    title: JavaScript学习记录四 toc: true date: 2018-09-16 20:31:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  7. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  8. Javascript定时器(二)——setTimeout与setInterval

    一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 set ...

  9. JavaScript学习(3):函数式编程

    在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...

随机推荐

  1. 作业test

    views Car <template> <div class="car"> <Nav/> <div class="wrap&q ...

  2. redis中重启和停止服务

    首先需要打开两个终端,一个是服务端,一个是客户端 1.开启服务端 redis-server 2.开启客户端 redis-cli 关闭双方之间的连接: 在客户端中输入:redis-cli shutdow ...

  3. LINUX对超级用户和普通用户的理解

    什么是超级用户 在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限.超级用户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理 ...

  4. 线性求所有数模p的乘法逆元

    推理: 假如当前计算的是x在%p意义下的逆元,设$p=kx+y$,则 $\Large kx+y\equiv 0(mod\ p)$ 两边同时乘上$x^{-1}y^{-1}$(这里代表逆元) 则方程变为$ ...

  5. Linux命令CURL用法

    Curl是一个命令行方式下传输数据的开源传输工具,支持多种协议包括:FTP,HTTP,HTTPS,IMAP,POP3,TELNET等.同样支持HTTP POST方法,PUT方法,FTP上传,cooki ...

  6. bzoj 1029 [JSOI2007]建筑抢修——贪心(伪dp)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1029 当然要按结束时间排序,然后按顺序修或跳过.就是那种“……不会使答案不优”的证明. 想了 ...

  7. SSM-5zookeeper在LINUX上自启

    把zookeeper做成服务 1.进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本 [root@zookeeper ~]# cd /etc/rc.d/init.d/ [ro ...

  8. mysql查询某个字段重复的数据

    查询某个字段重复的数据 ; 查询股票重复的营业厅 ;

  9. 命令模式(Command、Recevier、Invoker)(电脑开机命令)

    (将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.) 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是 ...

  10. ADSL pppoe 拔号工具rp-pppoe

    rp-pppoe 目前在各大发行版本都是存在的,比如Redhat/Fedora.红旗.Slackware.Debian.SuSE等系统,都是采用这个拔号软件,所以您大可不必为下载源码编译安装.只需要在 ...