Ответ 1
В конечном итоге это гарантирует, что значение this
в функции будет желаемым значением.
Общим примером является setTimeout
, который выполняется внутри обработчика click
.
Возьмите это:
$('#myElement').click(function() {
// In this function, "this" is our DOM element.
$(this).addClass('aNewClass');
});
Намерение достаточно простое. При нажатии myElement
он должен получить класс aNewClass
. Внутри обработчика this
отображается элемент, который был нажат.
Но что, если мы хотим короткую задержку перед добавлением класса? Мы могли бы использовать setTimeout
, чтобы выполнить его, но проблема в том, что любая функция, которую мы предоставляем setTimeout
, значение this
внутри этой функции будет window
вместо нашего элемента.
$('#myElement').click(function() {
setTimeout(function() {
// Problem! In this function "this" is not our element!
$(this).addClass('aNewClass');
}, 1000);
});
Итак, вместо этого мы можем вызвать $.proxy()
, отправив ему функцию и значение, которое мы хотим присвоить this
, и оно вернет функцию, которая сохранит это значение.
$('#myElement').click(function() {
// ------------------v--------give $.proxy our function,
setTimeout($.proxy(function() {
$(this).addClass('aNewClass'); // Now "this" is again our element
}, this), 1000);
// ---^--------------and tell it that we want our DOM element to be the
// value of "this" in the function
});
Итак, после того, как мы дали $.proxy()
функцию и значение, которое мы хотим для this
, она вернула функцию, которая обеспечит правильную установку this
.
Как это делается? Он просто возвращает анонимную функцию, которая вызывает нашу функцию с помощью метода .apply()
, который позволяет явно установить значение this
.
Упрощенный просмотр возвращаемой функции может выглядеть так:
function() {
// v--------func is the function we gave to $.proxy
func.apply( ctx );
// ----------^------ ctx is the value we wanted for "this" (our DOM element)
}
Итак, эта анонимная функция присваивается setTimeout
, и все, что она делает, это выполнить нашу исходную функцию с соответствующим контекстом this
.