有没有标准的机制来检测JavaScript是否作为WebWorker执行?
WebWorker在与传统JavaScript的“窗口”上下文完全分离的范围内执行。脚本是否有标准的方法来确定它本身是否作为WebWorker执行 我能想到的第一个“黑客”是检测worker范围内是否存在“窗口”属性。如果缺席,这可能意味着我们是作为一名网络工作者执行的 其他选项是检测标准“窗口”上下文中不存在的属性。对于Chrome 14,该列表当前包括:有没有标准的机制来检测JavaScript是否作为WebWorker执行?,javascript,html,web-worker,Javascript,Html,Web Worker,WebWorker在与传统JavaScript的“窗口”上下文完全分离的范围内执行。脚本是否有标准的方法来确定它本身是否作为WebWorker执行 我能想到的第一个“黑客”是检测worker范围内是否存在“窗口”属性。如果缺席,这可能意味着我们是作为一名网络工作者执行的 其他选项是检测标准“窗口”上下文中不存在的属性。对于Chrome 14,该列表当前包括: FileReaderSync FileException WorkerLocation importScripts openDatabas
FileReaderSync
FileException
WorkerLocation
importScripts
openDatabaseSync
webkitRequestFileSystemSync
webkitResolveLocalFileSystemSyncURL
检测WorkerLocation似乎是一个可行的备选方案,但这仍然让人觉得有点不妥。有更好的办法吗
编辑:是我用来确定正在执行的WebWorker中当前在“窗口”中的属性的JSFIDLE。说明:
DOM API(节点对象、文档对象等)在此版本的规范中不可供工作人员使用
这意味着检查是否有文档
是检查是否有员工的好方法。或者,您可以尝试检查是否存在?这对我很有用:
if (self instanceof Window) {
// not in worker
}
虽然这篇文章有点过时,但是添加了一些通用的替代品 库(用于异步/并行进程通用处理的库,作者)中使用的内容如下:
// other declarations here
,isNode = ("undefined" !== typeof global) && ('[object global]' === Object.prototype.toString.call(global))
// http://nodejs.org/docs/latest/api/all.html#all_cluster
,isNodeProcess = isNode && !!process.env.NODE_UNIQUE_ID
,isWebWorker = !isNode && ('undefined' !== typeof WorkerGlobalScope) && ("function" === typeof importScripts) && (navigator instanceof WorkerNavigator)
,isBrowser = !isNode && !isWebWorker && ("undefined" !== typeof navigator) && ("undefined" !== typeof document)
,isBrowserWindow = isBrowser && !!window.opener
,isAMD = "function" === typeof( define ) && define.amd
,supportsMultiThread = isNode || "function" === typeof Worker
,isThread = isNodeProcess || isWebWorker
// rest declarations here..
还有更多:
WorkerNavigator
等等
除非有关键字来检测webworkers,否则必须使用变量。
(在脚本设置或替换变量之前,任何东西都无法阻止恶意脚本运行。)
因此,假设在脚本运行之前没有任何恶意脚本,那么以下任何一行都可以工作:
this.DedicatedWorkerGlobalScope?this.__proto__ === this.DedicatedWorkerGlobalScope.prototype:false
this.WorkerGlobalScope?this.__proto__.__proto__ === this.WorkerGlobalScope.prototype:false // works for shared workers too
this.constructor === this.DedicatedWorkerGlobalScope //or SharedWorkerGlobalScope
!(this.DedicatedWorkerGlobalScope === undefined)
!(this.DedicatedWorkerGlobalScope === undefined)
您也可以使用self
而不是this
,但是由于this
无法设置,因此它更整洁
我更喜欢:
this.DedicatedWorkerGlobalScope !== undefined
当然,如果只有工作上下文和窗口上下文,则可以对窗口上下文执行反向测试。例如
this.Window===未定义的
这对我很有效
if (self.document) {
console.log('We are calculating Primes in Main Thread');
} else {
console.log('We are calculating Primes in Worker Thread');
}
为什么你不能检查一下
窗口
?那呢!(typeof window==“object”&&typeof document==“object”&&window.document===document)
?但它会在self
和window
都未定义的情况下抛出一个worker?哦,你是对的,但是window
仍然是未定义的并且instanceof
将因此抛出。@Bergi,是的,它会抛出一个错误。但可以从此处继续。请不要使用已弃用的\uuuuuuuuuuuuuuuuuuuuuuuuu
。使用Object.getPrototypeOf()
,或只使用.isPrototypeOf
或instanceof
。