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では、これがコンソールに記録されるものです。 ステートメントが実行された場合、最初に
ウィンドウが オブジェクト{}


IE8では、これがコンソールに記録されるものです。
ウィンドウの
2番目のifステートメントが
ウィンドウ
オブジェクト{}を実行しました

myLibが呼び出されたときにこれがIEのウィンドウを指さないのはなぜですか?代わりにthis.windowを指していますか?

4

2 に答える 2

3

window変だ。windowこれは、オブジェクトとグローバルスコープオブジェクトの両方です。

window[[グローバルコンテキスト]]なので、これは機能します。

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

windowはグローバル変数なので、window.window === window

IE8でそれはwindow !== thisIE8があなたを憎んでいるからです。windowIE8は、グローバルコンテキストおよびグローバル変数として実装する方法を実際に台無しにしました。

コードの問題を解決するには

window.myLib = myLib;

window.myLib = function() {
    return new myLib();
};
于 2011-04-21T21:44:01.763 に答える
1

コンストラクター関数を呼び出さずにmyLibの呼び出しを回避しようとしている場合は、次のようにすることができます。

function myLib(){
  if(!(this instanceof myLib)){
    return new myLib();
   }
}
于 2011-04-21T21:45:05.487 に答える