2011-04-21 94 views
1
<script type="text/javascript" src="https://getfirebug.com/firebug-lite.js"></script> 
<script> 
(function(){ 
    var myLib = function (selector) { 
     console.log(this); 
     if(this === window) { 
      console.log('first if statement executed'); 
      console.log(this); 
      return new myLib(selector); 
     } 
     if(this.window === window){ 
      console.log('second if statement executed'); 
      console.log(this); 
      return new myLib(selector); 
     } 
    }; 

    //expose myLib to the global window object 
    window.myLib = myLib; 
})(); 

myLib('.someclass') 

</script> 

在Firefox中,這是被記錄到控制檯:
窗口
第一個if語句執行
對象{}
在JavaScript中this關鍵字問題

在IE8,這是什麼得到登錄到控制檯:
窗口
秒如果執行語句
風流
對象{}

爲什麼當MYLIB調用不是指向IE窗口,而是this.window點的窗口?

+0

簡短版本:對於'window',IE很奇怪。 – 2011-04-21 21:39:40

回答

3

window很奇怪。它既是window對象又是全局作用域對象。

由於window是[全球背景]那麼這個工程:

var o = 5; 
window.o === 5; // true 

由於window是一個全局變量,然後window.window === window

事實上,在IE8 window !== this是因爲IE8恨你。 IE8真的搞砸了它實施window作爲全球背景和作爲一個全球變量的方式。

爲了解決代碼問題變化

window.myLib = myLib;

window.myLib = function() { 
    return new myLib(); 
}; 
+1

有趣的是,我只是想鏈接到你之前關於這個問題:http://stackoverflow.com/questions/4850978/ – 2011-04-21 21:46:02

+0

@MattBall在那個問題,我沒有特別檢查'窗口===這個' – Raynos 2011-04-21 21:47:17

+0

謝謝,我不知道IE的窗口的不同實現。 – skaterdav85 2011-04-25 20:43:59

1

,如果你想避免調用MYLIB而不調用構造函數,你可以做這樣的事情:

function myLib(){ 
    if(!(this instanceof myLib)){ 
    return new myLib(); 
    } 
} 
+0

謝謝。我只是用這個而不是檢查這個指向的內容,看到IE的窗口實現,這個指向與其他瀏覽器不同。 – skaterdav85 2011-04-25 20:44:36