Web worker importScripts 无法将脚本变量放入全局范围

Web worker importScripts fails to place script variables in global scope

TL;DR 我有一个工人通过 importScripts 导入两个对象。它们没有出现在 "self" 中。 Moz 文档说:

        importScripts() method of the WorkerGlobalScope interface 
        synchronously imports one or more scripts into the worker's scope.

那么他们在哪里?!

详情: 三个文件:index.html、worker.js、foo.js

index.html 包含:

const worker = new Worker('./worker.js')
worker.postMessage({ file: './foo.js', var: 'foo' })

worker.js 包含:

onmessage = e => {
    params = e.data
    console.log('worker: params', params)
    console.log('worker: this === self', this === self)
    importScripts(params.file)
    console.log(self[params.var], eval(params.var), foo)
}

foo.js 包含:

const foo = { one: 1, two: 2 }
const bar = { three: 3, four: 4 }

即html 将路径和变量名称传递给导入路径的工作程序,并使用变量名称尝试在 "self" 中找到它。失败。

然而,使用 "eval" 或变量本身,而不是它的名称,都能按预期工作。

控制台消息如下:

worker: params {file: "./foo.js", var: "foo"}
worker: this === self true
undefined {one: 1, two: 2} {one: 1, two: 2}

那么worker将从foo.js导入的变量放在哪里?!

注意:这看起来很奇怪,为什么不直接使用变量呢?存在与高度(重新)分解的回购有关的深层原因。

使用constlet声明变量不会将它们添加到全局作用域对象中,例如工人selfwindow(参见MDN description for const).但是,使用 var 可以:

const x = 1;
let y = 2;
var z = 3;

console.log(window.x, window.y, window.z);
// undefined undefined 3

foobar 的变量声明更改为使用 var 应该可以解决问题。