Я пытался понять, как работают функции и область видимости javascript, и для меня это просто не имеет смысла. Может кто-нибудь объяснить, почему следующий код выводит: «животное говорит мяу» вместо «котенок говорит мяу»?
(function($, exports){
var animal = function(){};
exports.Animal = animal;
})(jQuery, window);
(function($, Animal){
var kitty = new Animal;
kitty.sayHi = function(){
console.log(this);
console.log('says meow');
}
$($.proxy(function(){
$('#js_test').click($.proxy(kitty.sayHi, kitty));
}, kitty))
})(jQuery, Animal);
UPDATE
@FunkyFresh указал в комментариях, что console.log вызывает toString, когда он передает объект, который по умолчанию возвращает тип объекта (животное). Когда я обновляю приведенный выше код, добавляя
animal.prototype.name = 'Mammal';
в верхнем блоке кода и
kitty.name = 'Zax';
в нижний, консоль выводит «Zax говорит мяу», что кажется правильным.