《JavaScript异步编程》试读:1.1.1 现在还是将来运行

在探究setTimeout之前,先来看一个简单的例子。该情形常常会迷惑JavaScript新手,特别是那些刚刚从Java和Ruby等多线程语言迁移过来的新手。 EventModel/loopWithTimeout.js for (var i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); }, 0); }; 4 4 4 大多数刚接触JavaScript语言的人都会认为以上循环会输出1,2,3,或者重复输出这3个数字,因为这里的3次延时都抢着要第一个触发(每次暂停都调度为0毫秒后到时)。 要理解为什么输出是4,4,4,需要知道以下3件事。 这里只有一个名为i的变量,其作用域由声明语句var i定义(该声明语句在不经意间让i的作用域不是循环内部,而是扩散至蕴含循环的那个最内侧函数)。 循环结束后,i===4一直递增,直到不再满足条件i<=3为止。 JavaScript事件处理器在线程空闲之前不会运行。 前两条还属于JavaScript 101的范畴,但第三个更像是一个“惊喜”。一开始使用JavaScript的时候,我也不太相信会这样。Java令我担心自己的代码随时会被中断。上百万种潜在的边界情况让我焦虑万分,我一直在想:“要是在这两行代码之间发生了什么稀奇古怪的事,会怎么样呢?” 然后,终于有一天,我再也没有这样的担心了……

>JavaScript异步编程

JavaScript异步编程
作者: Trevor Burnham
副标题: 设计快速响应的网络应用
原作名: Async JavaScript: Build More Responsive Apps with Less Code
isbn: 7115316570
书名: JavaScript异步编程
页数: 118
译者: 许青松
定价: 32.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2013-6