importScripts (web workers)

41

我尝试使用importScripts将第二个JavaScript文件加载到我的Web Worker中,但虽然没有出现任何错误,但它并没有起作用。 我将问题缩小到了这个非常简单的情况:

在主HTML文件中:

<script>
var w = new Worker("script1.js");
w.addEventListener("message", function(e){
    alert(e.data);
})
w.postMessage();
</script>

在 script1.js 文件中:

self.addEventListener("message", function(e){
    var a = 5;
    importScripts("script2.js");
    self.postMessage(a);
})

在 script2.js 文件中:

a = 6

我希望能看到一个对话框显示数字6,因为通过导入script2.js,a的值已经从5更改为6,但是对话框显示的仍然是5。我错过了什么吗?


在导入了脚本后,位于 importScripts("script2".js"); 之后的那一行 -->self.postMessage(a); 是否不再引用正确的 self 对象呢? - Four_lo
1个回答

51
在函数中使用 var a 表示 a 总是私有的。由于importScripts 添加到全局作用域,JavaScript 偏好访问函数中发布的更本地化的 a。您可以代替发布 a,发布 self.a,这将是您期望的 6。
编辑:最近有人亲自问过我关于这个问题,所以我做了一个演示来澄清行为:http://pagedemos.com/importscript/

2
pagedemos.com在Google Safe Browsing中返回警告。你能把它移到类似jsfiddle的地方吗? - Pablo Bianchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接