У меня есть небольшой вопрос относительно определения области видимости, когда я использую пользовательскую функцию обратного вызова, переданную в jQuery.animate(). Рассмотрим приведенный ниже код.Рекомендации по представлению результатов Javascript при использовании пользовательского обратного вызова
;var WebApi = (function projectInit (WebApi, $, Modernizr, window, document, undefined) {
$(element).on('click.skiptodocumentpart', function skipToDocumentPart (e) {
WebApi.scrollTo(
$(this.getAttribute('href')).offset().top,
1000,
$pageNav.length ? repositionPageNav($pageNav, $(this)) : null
);
return false;
});
function repositionPageNav ($pageNav, $elm) {
console.log(this); // undefined
};
WebApi.scrollTo = function (yPos, iSpeed, callback) {
$('html,body').animate({
scrollTop : yPos
},{
duration : typeof iSpeed === 'number' ? iSpeed : 1000,
complete : typeof callback === 'function' ? callback : null
});
};
return WebApi;
}(WebApi || {}, jQuery, Modernizr, this, this.document));
Когда я войти в контексте функции в repositionPageNav обратного вызова я получить неопределенный, в идеале я бы контекст ссылку на элемент нажал на, так как сам JQuery ussualy сделать. Я мог бы сделать это, изменив обратный вызов на WebApi.scrollTo следующим образом:
WebApi.scrollTo(
yPos,
1000,
as$pageNav.length ? (function (scope) {
return repositionPageNav.call(scope, $pageNav);
}(this)) : null
);
Создавая Замыкание контекста внутри обратного вызова в настоящее время относится к элементу щелкнул, как я предполагал, но делаю это представление больно? И одна вещь, которую я не могу понять, почему в первом примере контекст не определен? Это потому, что я не вызываю обратный вызов как callback.call (контекст)? Любые предложения/идеи?
Большое спасибо,
Nick.
А контекст. Я обязательно запомню это. В приведенных выше примерах не передается ли ожидаемый обратный вызов с исполнением до завершения анимации()? – ngr
Как сказано, вы не проходите обратный вызов. Вы вызываете функцию немедленно и передаете результат ('undefined'). – Bergi
Итак, передав его как repositionPageNav ($ pageNav, $ (this)), он вызывает это немедленно? Возможно, лучше будет использовать jQuery.proxy (repositionPageNav, контекст, аргументы). – ngr