JavaScript中的这个关键字问题

时间:2011-04-21 21:37:09

标签: javascript this-keyword

<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 指向窗口?

2 个答案:

答案 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();
   }
}