эта проблема с ключевыми словами в JavaScript - PullRequest
1 голос
/ 22 апреля 2011
<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 выполненОбъект {}

В IE8 это то, что регистрируется на консоли: Окновторой оператор if выполненОкноОбъект {}

Почему this не указывает на окно в IE при вызове myLib, а вместо этого this.window указывает на окно?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

window странно.Это и объект window, и объект глобальной области видимости.

Так как * [1005 * является [[Global Context]]], то это работает:

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 голос
/ 22 апреля 2011

если вы пытаетесь избежать вызова myLib без вызова функции конструктора, вы можете сделать что-то вроде этого:

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