Javascript 为什么使用函数声明不适用于web workers的onmessage?
TL;DR是指当web worker的onmessage()处理程序被定义为函数声明而不是函数表达式时,它不起作用。(至少在Chrome中是这样)我一辈子都想不出为什么 我有以下简单的示例设置: index.htmlJavascript 为什么使用函数声明不适用于web workers的onmessage?,javascript,google-chrome,web-worker,Javascript,Google Chrome,Web Worker,TL;DR是指当web worker的onmessage()处理程序被定义为函数声明而不是函数表达式时,它不起作用。(至少在Chrome中是这样)我一辈子都想不出为什么 我有以下简单的示例设置: index.html 网络工作者测试 index.js 函数运行(文件名){ 工人=新工人(文件名); 工人。邮政信息(“测试”); } test1.js onmessage=函数(msg){ console.log(msg.data); } log(self.onmessage); test2
网络工作者测试
index.js
函数运行(文件名){
工人=新工人(文件名);
工人。邮政信息(“测试”);
}
test1.js
onmessage=函数(msg){
console.log(msg.data);
}
log(self.onmessage);
test2.js
函数onmessage(msg){
console.log(msg.data);
}
log(self.onmessage);
你可以自己去试试。如果单击test1按钮,它将记录以下内容(至少在Chrome 79.0.3945.117上):
这表明函数是按预期定义的,处理程序正在工作
相反,当您单击test2时,得到的结果是:
ƒ onmessage(msg) {
console.log(msg.data);
}
这表明脚本正在工作,并且函数已经定义,它只是因为任何原因没有作为处理程序运行。全局对象的
onmessage
属性是一个setter。setter不会被函数声明调用;相反,它们只是被覆盖,就好像事先运行了delete
。下面是另一个例子:
Object.defineProperty(窗口'fn'{
集合(newVal){
log('setter-invoked');
},
可配置:true
});
函数fn(){
}
console.log(window.fn);
ƒ onmessage(msg) {
console.log(msg.data);
}