Вообще 'это' указывает на объект хостинг метод называется. (Вы можете переопределить Function.call (thisObject, арг1, arg2) или Function.apply (thisObject, [список аргументов]).)
Простой пример:
var myObject = {
value: 1,
report: function() {
return "value: " + this.value;
}
}
console.log(myObject.report()); // "value: 1"
Должно быть вполне понятно.
Использование конструктора и прототипа, это было бы:
function Reporter(v) {
this.value = v;
}
Reporter.prototype = {
report: function() { return "value: " + this.value; }
};
var myObject = new Reporter(1);
console.log(myObject.report()); // "value: 1"
работает точно так же. «this» - это объект, созданный при вызове «new Reporter (1)», а «this» в прототипе относится к объекту, который вызывается методом «report()». (прототип приходит только в игру, если нет методы «отчета()» определен в «MyObject» как собственность.)
Теперь немного больше вложенный:
function ComplexReporter(v) {
this.value = v;
}
ComplexReporter.prototype = {
report: function() { return "value: " + this.value; },
utils: {
innerReport: function() { return "value: " + this.value; }
}
};
var myObject = new ComplexReporter(1);
console.log(myObject.report()); // "value: 1"
console.log(myObject.utils.innerReport()); // "value: undefined"
Первый звонок как и выше, и обеспечивает ожидаемый результат.
Во втором вызове «это» не так, как можно было ожидать «myObject», но «myObject.prototype.utils», который не имеет свойства @value любого типа. Это эффективно
ComplexReporter.prototype.utils.innerReport.apply(myObject.prototype.utils, []);
Так, как правило, «это» является объектом описывается путь до самого последнего идентификатора до последней точки при вызове метода объекта в дот-нотации.
Последний пример без прототипа (чтобы сделать это немного проще снова):
var myComplexObject = {
value: 1,
report: function() {
return "value: " + this.value;
},
utils: {
innerReport: function() {
return "value: " + this.value;
}
}
}
console.log(myComplexObject.report()); // "value: 1"
console.log(myComplexObject.utils.innerReport()); // "value: undefined"
// same as myComplexObject.utils.innerReport.apply(myComplexObject.utils, []);
console.log(myComplexObject.utils.innerReport.apply(myComplexObject, [])); // "value: 1"
И: «это» всегда оценивается в тот самый момент, функция вызывается (так что вы можете» t сохранить контекстуальный смысл «этого» при построении замыкания).
Я надеюсь, что эти примеры помогли немного в понимании того, как «это» работает ...
PS: Если этот объект-при условии, с помощью вызова Function.call() или Function.apply() is undefined or null, глобальный объект («self», в браузере, идентичном «окну») используется как «это».
Это зависит от того, что вызывает обратный вызов? –
Объект «Объект» – Tomatoes
Пожалуйста, разместите какой-нибудь реальный код, демонстрирующий проблему. С вашим псевдокодом трудно сказать, что конкретно у вас возникают проблемы, поскольку синтаксис нестандартен. – zzzzBov