<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中,这是登录到控制台的内容:
窗口
第二个if语句执行
窗口
对象{}
为什么这个在调用myLib时没有指向IE中的窗口,而是 this.window 指向窗口?
答案 0 :(得分: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 :(得分:1)
如果你试图避免在不调用构造函数的情况下调用myLib,你可以这样做:
function myLib(){
if(!(this instanceof myLib)){
return new myLib();
}
}