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导入的变量放在哪里?!
注意:这看起来很奇怪,为什么不直接使用变量呢?存在与高度(重新)分解的回购有关的深层原因。
使用const
和let
声明变量不会将它们添加到全局作用域对象中,例如工人self
或window
(参见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
将 foo
和 bar
的变量声明更改为使用 var
应该可以解决问题。
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导入的变量放在哪里?!
注意:这看起来很奇怪,为什么不直接使用变量呢?存在与高度(重新)分解的回购有关的深层原因。
使用const
和let
声明变量不会将它们添加到全局作用域对象中,例如工人self
或window
(参见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
将 foo
和 bar
的变量声明更改为使用 var
应该可以解决问题。