Javascript 检查窗口是否存在时,Web工作人员正在引发异常

Javascript 检查窗口是否存在时,Web工作人员正在引发异常,javascript,web-worker,Javascript,Web Worker,我一直在与web workers打交道,我试图创建一个类,当调用该类时,它将确定它是否可以在worker中执行其工作,或者是否没有在浏览器中实现。到目前为止,我有以下功能,正如我所期望的 var workerClass = { getInstance: function() { console.log("-- INSTANCE REQUESTED --") // If we have a worker we have an instance return

我一直在与web workers打交道,我试图创建一个类,当调用该类时,它将确定它是否可以在worker中执行其工作,或者是否没有在浏览器中实现。到目前为止,我有以下功能,正如我所期望的

var workerClass = {
    getInstance: function()  {
        console.log("-- INSTANCE REQUESTED --")
        // If we have a worker we have an instance return this.
        if (this.worker !== undefined) return this.worker;
        console.log("-- INSTANCE NOT CACHED --")

        //var 
        //    iAmWorker = window === undefined,
        //    iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined;

        var 
            iAmWorker = false,
            iCanBeAWorker = false;
        try{
            iAmWorker = window === undefined
            iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined;
        }
        catch(e){
            iAmWorker = true;
            iCanBeAWorker = true;
        }

        if (!iAmWorker && iCanBeAWorker){
            console.log("-- I AM NOT IN A THREAD - SPAWNING ONE --")
            this.worker = {
                obj: new Worker("worker.js"),
                callFunc: function(funcName, Args){
                    // MAKE REQUEST
                    this.obj.postMessage([funcName,Args]);
                    this.obj.onmessage = function(e) {  
                        console.log('-- MESSAGE RECEIVED FROM WORKER THREAD --');
                        console.log(e.data);
                        // COMPLETE DEFFERED OBJ
                    };  
                    // RETURN DEFFERED OBJ
                }
            }
            console.log("-- I AM IN A THREAD --")
        }else{
            // Actual Worker object regardless of in a thread or not
            this.worker = {
                obj: this,
                callFunc: function(funcName, Args){
                    return this.obj[funcName](Args);
                }
            }
        }

        return this.worker;
    },

    // Return a Deferred Object
    workRequest: function(content){
        return this.getInstance().callFunc("actualWork",[content]);
    },

    // Actual Work
    actualWork: function(content){
        console.log("-- SIMULATING SOME WORK --")

        var dt = new Date();
        while ((new Date()) - dt <= 3000) { /* Do nothing */ }
        console.log("-- SIMULATED WORK DONE --");

        return content + " world";
    }
}

// NOTE ONLY EVER TO BE USED IN A WORKER 
onmessage = function(args) {
    postMessage(workerClass.getInstance().callFunc(
        args.data[0],
        args.data[1]
    ));
} 
我的问题涉及以下几点。我知道工人家里根本不存在窗户。因此,我试图检查它的存在

var 
    iAmWorker = window === undefined,
    iCanBeAWorker = iAmWorker ? true : window.Worker !== undefined;
这引发了一个我需要抓住的例外,我觉得这既丑陋又愚蠢。是否有更好的方法实施此测试?


干杯,谢谢。

检查变量是否在当前范围内定义而没有任何异常风险的安全方法是使用
typeof

if (typeof window !== "undefined") {
    // code that references window
} else {
    // code that does not reference window
}
或者,可以检查特定类型:

if (typeof window === "object") {
    // code that references window
} else {
    // code that does not reference window
}

@Xufox它在窗口上抛出异常===未定义的检查,以及@Xufox的子访问器可能的重复项我不认为这是重复的,如果你在你链接的帖子中查看我检查未定义的代码…听起来你并没有尝试所有的建议。这样想:为什么
如果(xyz==3){
..
}
抛出一个
引用错误
,并带有“
xyz
未定义”?这里不一样吗,但有“
窗口
未定义”?所以你可能想检查一个变量 — <代码>窗口在这种情况下 — 甚至存在…@Xufox我明白你说的话了,我正在检查未定义的内容,但做得不对。类型(窗口)==“未定义”与窗口===未定义的作品。。。我的错我一直认为如果你想把它放进去的话,他们也会做同样的事。我会接受的,或者如果你想的话,我们可以像傻瓜一样接近。。我的错误阿波罗·吉斯你投票结束这个问题是正确的,因为我把事情搞砸了。@Spaceman-你不投票结束你自己的问题。如果你想删除它,那么只需使用“删除”按钮。无法删除,因为它已经这就是我所做的。
if (typeof window === "object") {
    // code that references window
} else {
    // code that does not reference window
}