jsfor循环阻塞妙用

JavaScript013

jsfor循环阻塞妙用,第1张

jsfor循环阻塞妙用是在不满足条件的情况下停止循环。Js阻塞机制,跟Js引擎的单线程处理方式有关,每一个window一个JS线程。所谓单线程,在某个特定的时刻只有特定的代码可以被执行,并阻塞其它的代码。

首先你得明白阻塞指的是什么,   nodejs里面的阻塞指的的I/O阻塞, 比如 文件读写, 网络流量等,    在你的观念里面,以为什么都可以阻塞是错误的, js的for循环中如果进行的是IO操作,那么,它也是非阻塞的。 基本在所有的程序语言里面,计算型的操作都是阻塞的,cpu 需要持续不断的工作才能完成 数据计算。

举个简单的例子来说明for的阻塞和非阻塞情况。(这里用setTimeout 来模拟

操作)

#阻塞型

for(var i = 0 i < 10i++  ){console.log(i)}

输出: 1,2,3 ...10

#非阻塞型

for(var i = 0  i < 10i++){

 setTimeout(function(){

     console.log(i)

 }, 10-i)

}

输出: 10, 9, ...0 #在实际中可能是这样的顺序,也可能不是的,因为无法预估 IO完成的实际时间。

循环是在瞬间完成的,也就是在瞬间启动三个计时器(时间间隔不会超过1毫秒),就好像发令枪响,三个人同时起跑。Javascript的计时器无法精确到8毫秒以内(不记得哪里看到了,也许随着平台改进会有所提升,但别指望能区分1-2毫秒),因此三个alert同时执行可能出现先后。

这与你循环中直接调用alert不同。因为alert会暂停for循环,等关闭alert后执行下面代码。

最好设置不同时值,间距大于10毫秒。你试试这样写

<script>

function testAnonymous() {

   var aa = 0

   var bb = 1

   for(var i = 0 i < 3 i++) {

      aa++

      bb++

      setTimeout('alert('+aa+')',1000+aa*10)

      //setTimeout(function(){return testDisplay(aa,bb)},1000)

    }

}

testAnonymous()

</script>