3

通常,如果您将函数调用为函数(而不是对象的方法),则this变量指向全局对象(即浏览器中的窗口对象)。我发现了一种情况,在 IE8 中,this变量与窗口对象不同(===),也不等于(==):http: //jsfiddle.net/zgJGU/1/

如果你看一下代码,你可能会注意到一个更奇怪的行为:值全局变化,因为它是从函数返回的(在函数内部它不等于 window;在函数外部它等于窗户)

(你可能会问,为什么这是一个重要的问题?因为我想检查我的函数是作为函数调用的,还是作为对象的方法调用的。)

你能解释一下这种奇怪的行为吗?(或检查函数是否作为方法或函数调用的正确方法)

4

1 回答 1

1

这确实是您发现的一个非常奇怪的问题。如果您在全局范围内隐式创建了一个新函数,那么结果可能是您所期望的。我已经修改了你的 jsFiddle 并在下面显示了它的一部分...... http://jsfiddle.net/VYcmT/

var ff = function() {
    var global = this;
    console.log(global === window);        // true       
    console.log(global == window);         // true
    return global;
};
var global = ff();
console.log(global === window);            // true
console.log(global == window);             // true

奇怪的是,如果您在全局范围 ( window) 之外显式定义一个函数,如以下代码段所示,那么 IE8 开始感到困惑...... http://jsfiddle.net/zsWUK/

似乎当您显式地将函数分配给window然后调用它时,IE8 会以某种方式变得this特别。比较window属性的this结果是积极的比较。看起来 IE8 似乎将对象this视为某种包装器window

window.ff = function() {
    var global = this;
    console.log(global === window);        // false       
    console.log(global == window);         // false
    console.log(global.window === window); // true
    console.log(global.window == window);  // true
    return global;
};
var global = ff();
console.log(global === window);            // false
console.log(global == window);             // true
console.log(global === window.window);     // true
console.log(global == window.window);      // true

好消息是上面和下面的代码片段都true在 Chrome、Firefox、IE9/10 等中返回......

于 2013-01-03T18:12:42.233 回答