IE中的Javascript:';这';关键字引用窗口对象(?)
我在代码中创建了一个JS对象(模块模式): 在chrome上运行“init”函数时,self==window(预期)为false。IE中的Javascript:';这';关键字引用窗口对象(?),javascript,jquery,explorer,Javascript,Jquery,Explorer,我在代码中创建了一个JS对象(模块模式): 在chrome上运行“init”函数时,self==window(预期)为false。 但当我在IE9上尝试时,我得到了真实的答案(!)。你能告诉我为什么吗?我希望“this”捕获我的自定义验证器对象,而不是窗口,在定义“self”时修复您的范围。此外,使用显式而非隐式比较器,即===非== var Validator = { regexEmail: /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z
但当我在IE9上尝试时,我得到了真实的答案(!)。你能告诉我为什么吗?我希望“this”捕获我的自定义验证器对象,而不是窗口,在定义“self”时修复您的范围。此外,使用显式而非隐式比较器,即===非==
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();
确定定义“自我”时的范围。此外,使用显式而非隐式比较器,即===非==
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();
可以使用立即执行的匿名构造函数
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
可以使用立即执行的匿名构造函数
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
使用警报(self==窗口)代码>而不是相等运算符。
此外,您还可以在此处查看接受的答案,以了解有关这两个运营商的更多详细信息:
还有一件事:正如Genius所说,确定您的范围:
var self=this;
使用警报(self==窗口)代码>而不是相等运算符。
此外,您还可以在此处查看接受的答案,以了解有关这两个运营商的更多详细信息:
还有一件事:正如Genius所说,确定您的范围:
var self=this;
我认为IE在这种情况下是正确的
因为定义self
时没有使用var
,所以它是一个隐式全局变量。尝试设置此全局self
时失败,因为浏览器中为window
的全局对象已具有window.self
属性,该属性是对窗口的引用
:
窗口、框架和自我IDL属性都必须返回窗口对象的浏览上下文的WindowProxy对象
这意味着window.self
应该是不可变的
因此,window.self==window
,它会提示true
然而由于历史上的黑客攻击与一些旧站点保持兼容,WebKit和Gecko中有一个漏洞,允许您覆盖它,即使您确实不应该能够覆盖它。我认为IE在这种情况下是正确的
因为定义self
时没有使用var
,所以它是一个隐式全局变量。尝试设置此全局self
时失败,因为浏览器中为window
的全局对象已具有window.self
属性,该属性是对窗口的引用
:
窗口、框架和自我IDL属性都必须返回窗口对象的浏览上下文的WindowProxy对象
这意味着window.self
应该是不可变的
因此,window.self==window
,它会提示true
然而由于历史上的黑客攻击与一些旧站点保持兼容,WebKit和Gecko中有一个漏洞,允许您覆盖它,即使您确实不应该能够覆盖它。这取决于你怎么称呼它。也许您将函数作为事件处理程序传递?只是一个更详细的解释:self=this
将this
赋值给全局变量self
。如果self
不是一个特殊的全局变量,您的代码将“工作”window.self
引用了window
,在某些浏览器中,此属性/全局变量被设置为只读。这取决于您如何调用它。也许您将函数作为事件处理程序传递?只是一个更详细的解释:self=this
将this
赋值给全局变量self
。如果self
不是一个特殊的全局变量,您的代码将“工作”window.self
引用了window
,似乎在某些浏览器中,此属性/全局变量是只读的。“init”可以使用一些“bind”ing。“init”可以使用一些“bind”ing。