理解javascript异步机制(setTimeout )

最近在学nodejs ,对于异步的概念早就理解了,但是,却有一个问题一直不解。


问题描述:

javascript是一个单线程的语言,那他是如何实现异步的呢?


看了很多资料,终于找到了答案:

所有的关键是:setTimeout、setInterval。


对于异步不了解的朋友自行google,我这里简单阐述一下javascript异步实现的两种机制

  • callback
  • 事件
其实,时间也通过callback实现的,那callback又是如何实现异步的呢?callback本身没什么神奇的地方,只不过是将一个函数体作为变量传入到另外一个函数中,callback可以有同步也可以异步,同步很简单,举个例子:

var func1=function(callback){
    //do something.
    (callback && typeof(callback) === "function") && callback();
}
func1(func2);
    var func2=function(){
}

上述code在执行自己要干的事后执行callback函数。

那异步的实现,则要靠 setTimeout 了,

function f1(callback){
    setTimeout(function () {
      // f1的任务代码
      callback();
    }, 1000);
  }

举个具体的例子:

function f1(callback){
    setTimeout(function () {
      // f1的任务代码
      callback();
    }, 1000);
  }
f1(function(){
	console.log('我居然第二个输出!');
})
console.log('我第一个输出!哈哈哈哈');

上面code中,f1 函数先被执行,然而却后输出,这就是因为用了 setTimeout 。记住下面这句话:

setTimeout、setInterval 这两个函数都是异步的,即:
他们的调用时序和程序的主流程是相对独立的,所以没有办法在主体里面等待它们的返回值,它们被打开的时候程序也不会停下来等待,否则也就失去了setTimeout及setInterval的意义了

(setTimeout的延迟时间为0,这个hack经常被用到,settimeout调用的函数其实就是一个callback的体现)

说了这么多,我主要想说的就是:javascript之所以能实现异步,主要靠的是setTimeout  ,而不仅仅是callback!!!

希望能给你们带来帮助。欢迎探讨。

参考资料:

http://www.cnblogs.com/yunkou/p/4088755.html 
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值