IE中的Javascript:'this'关键字指的是窗口对象(?)

时间:2013-03-24 09:07:28

标签: javascript jquery explorer

我在我的代码中创建了一个JS对象(模块模式):

var Validator = {
    regexEmail: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/,

    settings: {
        error_class: "error-field",
        formValid: true
    },

    init: function (form, default_error_class) {
        self = this;
        alert(self == window);
    },
};

在chrome上运行“init”函数时,我对self == window(预期)得到false。 但是当我在IE9上尝试时,我得到了真实(!)。你能告诉我为什么吗?我希望'this'捕获我的自定义Validator对象而不是窗口

4 个答案:

答案 0 :(得分:2)

在定义'self'时修复范围。另外,使用显式非隐式比较器,即=== not ==。

var Validator = {
    regexEmail: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/,

    settings: {
        error_class: "error-field",
        formValid: true
    },

    init: function (form, default_error_class) {
        var self = this;
        alert(self === window);
    },
};

Validator.init();

答案 1 :(得分:1)

您可以使用立即执行的匿名构造函数

var Validator = new function(){
    this.regexEmail = 
        /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
    this.settings = {
        error_class: "error-field",
        formValid: true
    };
    this.init = function (form, default_error_class) {
        console.log(this === window);
    };
    return this;
}();
Validator.init(); //=> false

答案 2 :(得分:0)

使用alert(self === window);而不是相等运算符。 此外,您可以在此处查看接受的答案,了解有关2位运营商的更多详情:Which equals operator (== vs ===) should be used in JavaScript comparisons?

还有一件事:正如Genius所说,修复你的范围:

var self=this; 

答案 3 :(得分:0)

我认为IE在这种情况下实际上是正确的。

因为在定义var时没有使用self,所以它是一个隐含的全局。当您尝试设置此全局self时,它失败,因为浏览器中的全局对象window已经具有window.self属性,该属性是对{{1}的引用}。

HTML Living Standard says

  

窗口,框架和自我IDL属性必须都返回Window对象的浏览上下文的WindowProxy对象。

这意味着window应该是不可变的。

所以,window.self并且它会发出警告。

然而由于历史黑客与某些旧网站保持兼容,因此WebKit和Gecko中有bug/feature允许您覆盖它,即使您真的不应该能够至。它seems (at least in Gecko) to have to dosplit objects