多线程么?在JS里面是没有多线程这个概念的。
但是可以用ajax或者setTimeout以及setInterval来模拟的,如:
function main(){
alert("主线程开始!");
//setTimeout接收两个参数,第一个参数是一个函数指针,第二个是整数,代表多少毫秒后执行第一个参数所指向的这个函数。
setTimeout(thread, 5000);
alert("主线程结束!");
}
function thread(){
alert("附线程开始!");
alert("附线程结束!");
}
javascript引擎是多线程的,可以理解为javascript引擎中有一个任务队列,所有的操作都可以被视为任务,当多个任务需要被执行时会放入到任务队列中由一个线程(就叫执行线程吧)顺序执行。那么如何实现异步呢,比如settimeout和setinterval,还有ajax。
settimeout/setinterval:settimeout和setinterval也可以视为任务,当执行到settimeout/setinterval时将其放入任务队列,同时通知javascirpt引擎用另一个线程计时,计时线程在计时完成时再放一个标记触发settimeout/setinterval的任务(自己想象的,不一定真的是这样实现的)到任务队列中。这样,只有任务队列中排在之前的任务完成之后才会去执行settimeout/setinterval的定时方法。这样就能在单线程的情况下实现看起来是异步的效果。
ajax:ajax也是大同小异,javascript在发送请求的时候,由javascript引擎创建新的线程去发送(这个过程可以是真异步哦)请求,当请求结束后(成功/失败都视为结束)在任务队列中放入回调任务,待排在任务队列前面的任务全都执行完成后才会调用ajax请求的回调方法。虽然看起来是异步的,但是仍然是在一个线程中完成的。
语言组织能力有限,有问题大家再互相交流吧
参考资料:http://www.laruence.com/2009/09/23/1089.html
另外附上几个验证方法
以下程序运行的结果是什么?
setTimeout(function(){alert("setTimeout invoked");},1000);
while(true){
}
setTimeout(function(){
while(true){
}
},1000);
setInterval(function(){
alert("setInterval invoked");
},1000);
// ajax就用jquery来模拟了
$.get("xxx.json",function(){
alert("ajax finished");
});
while(true){
}
所以,javascript中的异步是通过单线程模拟的假异步,只不过看起来是异步而已。
测试方法本身有点儿问题,不太严谨。
假设第一个函数是a
我们做AJAX的时候就是使用a
a函数的参数是b函数。
这里你要分清楚谁是回调函数。
实际上a是回调函数,b函数 你定义了对不对?但b函数是在a函数执行的时候才会执行的。
比较抽像。
具体假设ajax是个对象。假设已经取得为 ajax;
ajax.open();
ajax.onreadystatechange = function(){}
ajax.send();
这3个看到木有?
第二个是事件监听啊。
也就是监听了服务器的状态。这次请求的情况。
OK。
这个函数里面是什么呢?
if(ajax.status==4) {
处理。。。。。
}
看清楚没有了。回调函数其实是ajax.onreadystatechange 指向的这个函数。
学习中,继续关注