前言
javascript(以下簡稱js)是單線程語言,之所以是單線程,是因爲他的作用是用來跟用戶互動的,如果多線程,同時修改頁面上的Dom,則會出錯,開發起來會很複雜。
但是隨着js的作用越來越大,終端要求越來越高,我們是不是有些程序可以多線程處理,當然有,那就是H5的worker,那這樣的話豈不是跟上面說的矛盾了?請接着往下看!
下面我們將用一個列子先來實現worker,worker的API我就不說了,網上都查得到。這裏我主要用兩個方法,一個是onmessage(接收)、postMessage(發送)
主線程代碼
<body>
<input type="text" id="num">
<button id="but">計算</button>
<script>
window.onload = function() {
var but = document.getElementById('but')
var num = document.getElementById('num')
but.onclick = function() {
var n = num.value
var worker = new Worker('worker.js') // 註冊worker實例,傳入workerjs文件路徑
worker.onmessage = function(event) { // 接收worker傳來的消息
alert(event.data)
}
worker.postMessage(n) // 向worker發送消息
}
}
</script>
</body>
分線程代碼(worker.js)
注:在分線程JS中,無法訪問window全局下的方法與屬性,這個目的就是我們上面所說,不能多線程修改DOM,我們可以把複雜的計算用分線程來處理,當然,當前用得比較少,因爲還是有些不好的地方。
比如:
- 跟主線程比,計算會慢些
- 不能跨域加載
- 不能更新DOM
- 兼容性不友好(具體兼容哪些,大家去查查)
onmessage = function(event){ // 接收消息
var result = fibonacci(event.data)
postMessage(result) // 發送消息
}
// 計算
function fibonacci(n){
return n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2)
}
注:愛護原創,轉載請說明出處