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 中,这是记录到控制台的内容:
Window
first if statement executed
Object {}

在 IE8 中,这是记录到控制台的内容:
Window
second if statement executed
Window
Object {}

为什么调用myLib时this不指向IE中的窗口,而是this.window指向窗口?

4

2 回答 2

3

window很奇怪。它既是window对象又是全局范围对象。

既然window是 [[Global Context]] 那么这有效:

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

既然window是全局变量,那么window.window === window

事实上,在 IE8window !== this中是因为 IE8 讨厌你。IE8 确实搞砸了它window作为全局上下文和全局变量的实现方式。

解决您的代码问题更改

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 回答