Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么使用函数声明不适用于web workers的onmessage?_Javascript_Google Chrome_Web Worker - Fatal编程技术网

Javascript 为什么使用函数声明不适用于web workers的onmessage?

Javascript 为什么使用函数声明不适用于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

TL;DR是指当web worker的onmessage()处理程序被定义为函数声明而不是函数表达式时,它不起作用。(至少在Chrome中是这样)我一辈子都想不出为什么

我有以下简单的示例设置:

index.html


网络工作者测试
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);
}