简单介绍JavaScript的非阻塞机制

作者:日期:2016-08-28 20:56:47 点击:233 JavaScript

回调函数,阻塞和非阻塞对于初学者来说总是一些不好理解的东西,最好的办法就是通过实际写代码去体会。笔者今天就通过一个例子来简单解释一下JS的非阻塞,分享分享我的理解。

首先回调函数:这是一个异步过程,简单说就是,在一个函数的执行过程中,我去做我该做的事,在这期间我不管你,你可以去做你的事。但是当我做完我的事,之后,我就得通知你,接下来就看你的了。(本质是浏览器会不断给JS引擎的事件队列中添加事件,JS会依次去执行队列中的事件,这也是为什么说JS是事件驱动)


    function doSomething(callback) {
        callback("zhufeng");
    }
    function callbackFunc(name) {
        alert("I am " + name);
    }
    doSomething(callbackFunc);

然后非阻塞:正是因为有了回调函数我们才能达到非阻塞的目的,非阻塞就是我在一刻不停得做事,一直不停下来。我们来看个例子吧


    console.log("程序时间:" + new Date().getTime());
    setTimeout(function () {
        console.log("暂停一秒:" + new Date().getTime());
    }, 1000);
    console.log('这是暂停一秒之后的时间:' + new Date().getTime());

从这里我们可以看到执行的顺序是第一个console.log之后,遇到setTimeout,然后直接去执行第三个console.log,一秒后再来执行中间的那个。这个和java或者C#,C++都不一样。这就是非阻塞,当遇到需要等待的时候,直接跳过,等这边完了,再来执行。所以当我们在写代码时,就得注意一下这个特性,比如笔者最开始学的java面向对象编程,到了js这边开始遇到这样的问题还不知道怎么回事。比如在c#中


    console.writeLine("现在的时间" + DateTime.Now.ToString("HH:mm:ss"));
    Thread.Sleep(1000);
    console.writeLine("现在的时间" + DateTime.Now.ToString("HH:mm:ss"));

程序就会真的等一秒再执行下一步。这就是阻塞。所以java,C#等语言是多线程的,而JS,nodejs都是单线程的。希望我这样举的例子,能给一些学习基础的同学带来帮助。

上一篇: JavaScript引擎介绍,小白使用指南

下一篇: javascript中常用的继承