IE中的Javascript:';这';关键字引用窗口对象(?)

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

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

在chrome上运行“init”函数时,self==window(预期)为false。
但当我在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。