2012-10-16 114 views
3

通常,如果您调用一个函数作为函数(而不是一个对象的方法),则该变量指向全局对象(它是窗口在浏览器中的对象)。我发现一个情况,即,在IE8中,这个变量是不相同的(===),也不等于(==)window对象:如果你看看 http://jsfiddle.net/zgJGU/1/JavaScript窗口不等于也不等于IE8中的窗口

代码,您可能会注意到一个更奇怪的行为:值global更改,因为它是从函数返回(函数内部它不等于窗口;外部的函数它等于窗口)

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

你可以给这种奇怪的行为一些解释吗? (或正确的方法来检查函数是作为方法调用还是作为函数调用)

+0

在IE8(在IE9仿真),我得到真实的真假。在IE9中,他们都像Chrome一样给出“真实”。我想这是一个错误。 – pimvdb

+0

in ** real ** IE8(不在IE9中模拟)这是false false false false true – slobo

回答

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/

似乎是IE8莫名其妙地使this以某种方式特殊,当你明确地分配给window一个函数,然后调用它。比较thiswindow属性导致积极的比较。它看起来好像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 

好消息是,以上的和下面的代码片段都在浏览器,Firefox,IE9/10,等返回true ...