标签:
当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情。
可以运行以下示例,检验js的单线程特性。
相关代码请到github查看。
<div id=‘container‘></div>
<script>
window.alert(‘hi‘);
setTimeout(function(){
var ul = document.createElement(‘ul‘);
var li = document.createElement(‘li‘);
var text = document.createTextNode(‘world‘);
var container = document.getElementById(‘container‘);
li.appendChild(text);
ul.appendChild(li);
container.appendChild(ul);
console.log(‘done!‘);
},2000);
</script>
如果JavaScript是多线程,在弹出警告框两秒后,页面应该出现一个li标签(内容为world)。事实上因为JavaScript是单线程,所以如果你不点击弹出框的确定按钮,world这个li永远也出不来。
点击确定后
web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。
我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件路径,参数存放如果是相对地址,那么要以包含调用Worker构造函数语句所在脚本为参照,如果是绝对路径,需要保证同源(协议+主机+端口)。这个文件不需要我们在页面使用script标签显示引用。
var worker = new Worker(‘src/js/worker.js‘);
我们可以看到worker对象只有两个属性,其实是两个回调函数句柄
在其prototype内有两个重要方法
下面我们用web workers重写上面那个例子。
相关代码请到github查看。
test_web_worker.html
<script>
var worker = new Worker(‘./worker.js‘);
window.alert(‘hi‘);
</script>
worker.js
setTimeout(function(){console.log(‘done!‘);},2000);
注意到,弹出警告框两秒后控制台打印出了 done! ,好像实现了多线程一样。
标签:
原文地址:http://blog.csdn.net/qiqingjin/article/details/51330878