2013-11-27 2 views
-1

Я ранее опубликовал аналогичный вопрос в контексте jquery, но внутренняя обработка jQuery this смутила вопросы. Таким образом, чтобы держать это ясно и просто рассмотреть:javascript: «this» во внутренней функции

function someCallbackFunction() { 
    this.name = "Tom"; 
} 

anObject.method(someCallbackFunction); 

что такое «это» из someCallbackFunction указывая на при вызове «anObject»?

То есть, когда функция «некоторая функция обратного вызова» вызывается объектом (в рамках одной из его функций), что такое «это» (внутренняя) «некоторая функция обратного вызова», указывающая на то? [не «это» из «внешнего» (AnObject.function, который, конечно, указывает на AnObject или другую вызывающую функцию при вызове с вызовом или применить)]

Я думаю, что он должен указывать на глобальный объект (window объект), так как this внутри замыкания укажет на глобальный объект DOM window (в нестрогом режиме) или будет undefined (в строгом режиме).

+0

Это зависит от того, что вызывает обратный вызов? –

+0

Объект «Объект» – Tomatoes

+3

Пожалуйста, разместите какой-нибудь реальный код, демонстрирующий проблему. С вашим псевдокодом трудно сказать, что конкретно у вас возникают проблемы, поскольку синтаксис нестандартен. – zzzzBov

ответ

1

this зависит от того, как функция вызывается. Если вы позвоните по-своему mycallback(), this будет ссылаться на window объект. Если вы позвоните по телефону mycallback.call(object) (или apply), this будет ссылаться на object.

http://jsfiddle.net/ydqZ8/1/

function callback() 
{  
    alert(this.toto); 
} 

window.toto = 0; 
var obj = { 
    toto : "TOTO" 
}; 

callback(); // displays 0 
callback.call(obj); // displays TOTO 
+0

да, я это понимаю, но когда функция «некоторая функция обратного вызова» вызывается объектом (в рамках одной из его функций), что означает «это» (внутреннее) «некоторая функция обратного вызова», указывающая на то? [не 'this' of" external "(AnObject.function - который, конечно же, указывает на AnObject или другую вызывающую функцию при вызове с вызовом или применить)] – Tomatoes

+0

Я только что ответил вам. Это зависит от того, как внутри метода 'метод' вызывается' некоторая функция обратного вызова'. Как я только что объяснил: http://jsfiddle.net/ydqZ8/2/ – dooxe

+0

doxee, что, если он был = anObject.method (anotherObject.someCallbackFunction); – Tomatoes

0

Попробуйте это:

var self = this; 
some callback function() { 
    self.name = "Tom"; 
} 

Object.function (some callback function); 
+0

Я знаю, что ваш ответ работает, но я хочу знать, что на самом деле указывает это. Объект DOM или нет? – Tomatoes

+0

4 уверен, что это работает с лучшими практиками: см. Https://github.com/stevekwan/best-practices/blob/master/javascript/best-practices.md – Cracker0dks

0

Вообще 'это' указывает на объект хостинг метод называется. (Вы можете переопределить 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», в браузере, идентичном «окну») используется как «это».

Смежные вопросы