Web Worker中是否必须使用self属性?二者差异是什么?
Web Workers中self的使用疑问解答
是否必须使用self?
不需要。在Worker的全局作用域中,onmessage、postMessage这类核心API本身就是全局属性/方法,直接调用和通过self.调用效果完全一致。和普通JS中window的类比是否成立?
逻辑上类似,但存在本质区别:- 主线程的全局对象是
window,self只是window的别名;但Worker里没有window对象,全局作用域是WorkerGlobalScope(专用Worker对应DedicatedWorkerGlobalScope),self就是这个全局作用域对象的直接引用。 - 和主线程可以省略
window调用全局方法一样,Worker里省略self也是因为目标方法本身就在全局作用域内。
- 主线程的全局对象是
需要显式使用self的场景示例
当Worker代码中存在局部变量/函数与全局API同名时,必须用self.来区分全局和局部作用域:
// Worker内部代码 // 定义一个局部的postMessage函数 function postMessage(msg) { console.log('局部函数输出:', msg); } // 调用局部函数 postMessage('测试局部'); // 调用Worker全局的postMessage(向主线程发消息),必须加self. self.postMessage('发送给主线程的消息');
如果这里不用self.,调用的会是局部定义的postMessage,而非用来和主线程通信的全局API。
内容的提问来源于stack exchange,提问作者hamid-davodi
相关产品推荐
相关产品推荐

