Чтобы понять, почему this
не является ссылкой на объект, на котором функция проживает, вы должны понимать, что JavaScript не имеет классов. Он имеет функции.
В JavaScript функции никогда строго не привязаны к объектам, как они есть в таких классных языках, как Java, C#, что угодно. Функция javascript - это еще один тип, такой как string
и number
, что означает, что вы можете передавать функции вокруг переменных, подобных любому другому типу. В вашем примере функция, содержащаяся в foo.bar
, вообще не знает о foo
. Это просто функция, учитывающая собственный бизнес.
И что же делает ключевое слово this
? Он указывает на контекст . В вашем примере вы вызываете функцию внутри foo.bar
из глобальной области (то есть window
), поэтому на это указывает. Вы можете использовать apply()
для вызова функции в правильной области, но для этого вам потребуется доступ к этой области (в данном случае объект foo
). Это отрицает любые преимущества безопасности при прохождении только функции без объекта.
Чтобы исправить эту «проблему», в ECMAScript 5 (будущая версия JavaScript) вводится . Эта удобная функция позволяет связать функцию определенного объема выполнения перед передачей его в другую функцию, например:
var foo = {
bar: function() { return this.baz; },
baz: 1
};
var callback = foo.bar.bind(foo);
(function(){
return typeof arguments[0]();
}(callback));
Это не так. Ключевое слово 'this' указывает на контекст выполнения. В данном примере это область анонимной функции, которая ее вызывает. Так как сам он вызывается из глобальной области, 'this' просто указывает на глобальный объект' window'. – PPvG
Было бы неловко, если бы у нас было много функций в этом объекте, и мы хотели изменить имя foo :) – abuduba
Почему это принятый ответ? Я думал, что вопрос: «Почему этот код возвращает« undefined »?» *, Not * «Можете ли вы помочь мне найти уродливый хак, чтобы исправить это?» *. – PPvG