Обновление: kitty
- это экземпляр из Animal
. Так что это никогда не скажет Китти. Все эти proxy
обертки - это осторожные неправильные указания.
Посмотрим:
(function($, exports){
var animal = function(){};
exports.Animal = animal;
})(jQuery, window);
Просто маскировка, чтобы сказать: window.Animal = function(){};
Вы создаете анонимную функцию, передавая ей jQuery и объект window и немедленно ее выполняете. Это создает Animal
класс в window
scope
Теперь jquery.proxy позволяет вам изменять контекст функции: jQuery.proxy( functionName, context )
- поэтому внутри functionName
, this
относится к context
(this == context
).
$.proxy(kitty.sayHi, kitty)
говорит, что звонок sayHi
передает kitty
в качестве контекста.
Теперь kitty = new Animal
(это на самом деле называется замыканием, поскольку вы обращаетесь к переменной родительской функции), поэтому this
-> Animal
(function($, Animal){
// create a new instance of Animal, assign it to local variable kitty
var kitty = new Animal;
// assign sayHi to kitty object
kitty.sayHi = function(){
console.log(this);
console.log('says meow');
}
// $() shortcut that says run this code on DOM ready
$($.proxy(function(){
// this proxy almost does nothing as we do not refer to this object insdie it
// says on click of js_Test, call kitty.sayHi with context = kitty
$('#js_test').click($.proxy(kitty.sayHi, kitty));
}, kitty))
})(jQuery, Animal);
Таким образом, когда вызывается обработчик щелчка, он на самом деле Animal.sayHi
.