2012-10-16 41 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 ...