为什么这个 === 窗口在 JavaScript 范围安全构造函数中是假的?

Why this === window is false in JavaScript scope safety constructor?

提问人:artwl 提问时间:9/7/2012 最后编辑:artwl 更新时间:9/7/2012 访问量:319

问:

我的代码是:

(function(){
    var test=function(){
        if(this === window)
            return new test();
    }

    test.prototype.play = function(){
        alert("Hello");
    };

    window.Test=test;
})();

window.onload=function(){
    Test().play();
};

这可以很好地工作,但是在,错误显示,谁能告诉我为什么?IE9+firefoxchromeie 6/7/8Test().play();

错误信息为:

enter image description here

JavaScript 构造函数 窗口

评论

0赞 aroth 9/7/2012
如果该行导致错误,则可能是因为未执行。您是否尝试过添加 try/catch 块?window.Test=test;Test().play();
0赞 RobG 9/7/2012
您可能会在揭开神秘面纱的命名函数表达式中找到答案。
1赞 9/7/2012
你得到什么错误?虽然代码很丑陋,但没有什么能立即让我大错特错。
1赞 jfriend00 9/7/2012
在 IE7 中似乎对我来说工作正常:jsfiddle.net/jfriend00/J6y6G
0赞 artwl 9/7/2012
@pst错误信息为“undefined”,则为 null,而不是对象

答:

0赞 RobG 9/7/2012 #1

IE 在函数表达式方面有一些怪癖,请考虑(未在 IE 8 中测试,因为我目前没有):

(function(global){

    function test() {
        if (this === global)
            return new test();
    }

    test.prototype.play = function(){
        alert("Hello");
    };

    global.Test = test;

})(this);

window.onload = function(){
    Test().play();
};

另一种测试是:

    if (!(this instanceof Test))

评论

0赞 9/7/2012
但什么时候会呢?window !== global
0赞 artwl 9/7/2012
使用我得到同样的错误,使用还可以this === globalif (!(this instanceof Test))
0赞 9/7/2012
(我真的看不出[命名]函数表达式在这里是如何应用的。
0赞 9/7/2012
@artwl 好奇,使用时会发生什么?(通过方法。window.Test().play()this === window
0赞 artwl 9/7/2012
@pst'窗口。Test()' 为 null 或不是对象