为什么这个变量赋值会抛出错误?

时间:2016-10-28 10:08:43

标签: javascript

我正在调查此javascript

上的间歇性错误
parentWindowState = window.opener && window.opener.ACME && window.opener.ACME.state

如果你想看到函数的其余部分,那就是:

_doStuff:  function () {
    var someVar = '',
        parentWindowState = window.opener && window.opener.ACME && window.opener.ACME.state,
        deferred = Q.defer();

    if (parentWindowState && parentWindowState.getItem('...')) {
        //lots of code                
    } else {
        deferred.resolve();
    }
    return deferred.promise;
}

用户报告收到此错误

    Error at _doStuff (https://acme/anvils/yoloeditor/main_20160531050717.js:456321:13) 
at Anonymous function (https://acme/anvils/yoloeditor/main_20160531050717.js:111202:37) 
at _fulfilled (https://acme/anvils/yoloeditor/main_20160531050717.js:29048:13) 
at Anonymous function (https://acme/anvils/yoloeditor/main_20160531050717.js:29078:13) 
at promise.promiseDispatch (https://...

我尝试通过调试并将变量openerACMEstate设置为nullundefined来重现此错误,但代码不会抛出一个错误。它实际上应该处理null / undefined值。

我只能通过强行抛出像

这样的错误来获得这样的错误
 throw new Error("Boom");

所以我的问题是,在什么情况下该行会抛出错误?

编辑:我在尝试使用Chrome时尝试重现此错误。刚刚意识到如果未定义ACME,Internet Explorer将抛出错误。

1 个答案:

答案 0 :(得分:0)

看起来我一直在使用Chrome进行测试,但IE不会在不抛出'TypeError'的情况下处理此声明

我已按如下方式更改了分配,IE可以处理它

window.opener && (typeof window.opener.ACME == 'object') && window.opener.MOS.ACME 

我知道promises可以swallow errors,但这不是这里的情况,因为上面的语句甚至会通过摆弄IE控制台或者将语句完全移出承诺方法的主体而引发错误。所以我认为Q.defer()是一个红色的鲱鱼。

相关问题