Javascript это указывает на объект Window - PullRequest
8 голосов
/ 27 апреля 2010

У меня есть следующий код. Я ожидал увидеть объект «архив» на моей консоли Firebug, но я вижу объект Window. Это нормально?

var archive = function(){}

archive.prototype.action = {
    test: function(callback){
        callback();
    },
    test2: function(){
        console.log(this);
    }
}

var oArchive = new archive();
oArchive.action.test(oArchive.action.test2);

1 Ответ

6 голосов
/ 27 апреля 2010

oArchive.action.test2 возвращает ссылку на функцию, на которую затем указывает callback, но эта функция затем вызывается с использованием callback(), что означает, что она не вызывается как метод, и, следовательно, this является глобальным объектом , Ключевым моментом является то, что this не связан с функцией: он определяется тем, как вызывается функция.

В этом случае вы могли бы явно указать this на указание на объект действия (но не на объект архива) с помощью метода call или apply функции обратного вызова:

test: function(callback) {
    callback.call(this);
},

Чтобы вместо него this быть объектом архива, вам нужно передать объект архива в:

var archive = function(){}

archive.prototype.action = {
    test: function(callback, archive){
        callback.call(archive);
    },
    test2: function(){
        console.log(this);
    }
}

var oArchive = new archive();
oArchive.action.test(oArchive.action.test2, oArchive);
...