我在我的代码中创建了一个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对象而不是窗口
答案 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}的引用}。
窗口,框架和自我IDL属性必须都返回Window对象的浏览上下文的WindowProxy对象。
这意味着window
应该是不可变的。
所以,window.self
并且它会发出警告。
然而由于历史黑客与某些旧网站保持兼容,因此WebKit和Gecko中有bug/feature允许您覆盖它,即使您真的不应该能够至。它seems (at least in Gecko) to have to do与split objects。