2010-04-27 1 views
8

У меня есть следующий код. Я ожидал увидеть объект «archive» на моей консоли firebug, но я вижу объект Window. Это нормально?Javascript это указывает на объект 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); 

ответ

6

oArchive.action.test2 получает вам ссылку на функцию, которая callback затем указывает, но эта функция затем вызывается с помощью callback(), что означает, что не вызывается как метод и, следовательно, 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);