Чтобы понять эту проблему, вы должны понять, как Javascript устанавливает значение this
в вызове функции.
Там есть список всех методов здесь: When you pass 'this' as an argument
Для вашего конкретного случая, когда вы делаете это:
var testing = obj.value.getName;
Теперь у вас есть ссылка на функцию getName
. У вас больше нет связи с obj.value
. Итак, test()
просто вызывает getName
как обычную функцию. В Javascript, когда выполняется обычный вызов функции, значение this
будет либо глобальным объектом (в браузере), либо в строгом режиме, оно будет неопределенным.
В вашем случае, this
становится объектом window
так this.name
является window.name
, который указывает на глобальную переменную name
и, таким образом, вы получите результат "Gerorge Томаса.
Фактически, если вы запустите свой код в режиме strict
, это вызовет ошибку, которая, по сути, является одним из преимуществ строгого режима, который указывает на случайные ошибки, подобные этому.
С другой стороны, если выполнить функцию с формой obj.method()
, то this
устанавливается равным obj
. Итак, когда вы делаете:
obj.value.getName()
, что эквивалентно:
var o = obj.value;
o.getName()
который является obj.method()
форму вызова функции, которая будет задавать this
указатель быть объектом, который в данном случае является obj.value
.
Можно обойти эту проблему несколькими способами. Вот пример работы с ним, используя .bind()
.
var name = 'Gerorge Thomas';
var obj = {
name: 'Cinderella',
value: {
name: 'HocusPocus',
getName: function() {
return this.name;
}
}
};
document.write(obj.value.getName() + "<br>");
var testing = obj.value.getName.bind(obj.value);
document.write(testing());
да, это дает нам спасибо! – deroccha
Отсутствует копия выполняемой функции - есть еще одна функция. Существует назначение ссылки на вторую переменную. Но это назначение не имеет ничего общего с проблемой OP. Проблема заключается в том, как вызывается функция. – jfriend00
Небольшая техническая деталь, которая здесь не имеет значения, но я возьму ваше слово. – DanMan