Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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是否作为WebWorker执行?_Javascript_Html_Web Worker - Fatal编程技术网

有没有标准的机制来检测JavaScript是否作为WebWorker执行?

有没有标准的机制来检测JavaScript是否作为WebWorker执行?,javascript,html,web-worker,Javascript,Html,Web Worker,WebWorker在与传统JavaScript的“窗口”上下文完全分离的范围内执行。脚本是否有标准的方法来确定它本身是否作为WebWorker执行 我能想到的第一个“黑客”是检测worker范围内是否存在“窗口”属性。如果缺席,这可能意味着我们是作为一名网络工作者执行的 其他选项是检测标准“窗口”上下文中不存在的属性。对于Chrome 14,该列表当前包括: FileReaderSync FileException WorkerLocation importScripts openDatabas

WebWorker在与传统JavaScript的“窗口”上下文完全分离的范围内执行。脚本是否有标准的方法来确定它本身是否作为WebWorker执行

我能想到的第一个“黑客”是检测worker范围内是否存在“窗口”属性。如果缺席,这可能意味着我们是作为一名网络工作者执行的

其他选项是检测标准“窗口”上下文中不存在的属性。对于Chrome 14,该列表当前包括:

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