Обратный вызов jQuery - строгое нарушение
-
11-12-2019 - |
Вопрос
Я получаю основное представление о this
не находясь в method
когда в strict mode
упомянутый здесь, но, честно говоря, это становится немного эрудированным.Итак, в более прозаических терминах:
У меня есть такой обработчик, как этот:
$('.myClass').one('keyup', function() {
var $this = $(this);
etc etc
});
Я хочу изменить его на этот:
function myFunction () {
var $this = $(this);
etc etc
};
$('.myClass1').one('keyup', myFunction);
$('.myClass2').one('keyup', myFunction); etc
Ему это не нравится, потому что в strict mode
потому что я использую this
вне метода.Я понимаю это.
Однако мне нужно иметь myFunction
отдельно от обработчика, потому что (1) он привязан к различным классам/элементам и (2) я использую .off().one('keyup', myFunction)
чтобы сбросить настройки one
обработчик для различных классов в разных точках.
Итак, как мне обойти наличие отдельной функции обратного вызова, не нарушая this
бизнес?
Решение
Я получаю основную идею о том, что это не относится к методу, когда он находится в строгом режиме...
Да, но вы путаете две несвязанные вещи:Строгий режим и JSLint.Они в значительной степени не связаны (за исключением того, что в JSLint есть возможность требовать строгий режим).
В строгом режиме с вашим кодом проблем нет.Это совершенно допустимо и уместно (из-за того, как использует jQuery this
). Пример Есть нет там "строгое нарушение".
JSLint это не нравится, но JSLint не нравится многое из того, что совершенно допустимо и уместно.JSLint обнаруживает комбинацию вещей, которые, по общему признанию, являются проблемами (например, пропущенные точки с запятой), и вещей, которые Дугласу Крокфорду не нравятся с точки зрения стиль перспектива.Крокфорд умен и хорошо информирован, но не все согласны с его выбором стиля.
Инструменты для удаления ворса очень полезны и являются неотъемлемой частью инструментария.JSLint менее полезен, чем мог бы быть (на мой взгляд), поскольку связывает проблемы с содержанием с проблемами стиля (хотя, конечно, с JavaScript это тонкая грань).Вы могли бы рассмотреть возможность использования JSHint - синт, вилка, которая дает вам больше контроля над тем, что она проверяет.
Другие советы
Разве вы не можете вместо этого использовать объект event?
т.е.
function myFunction (e) {
var $this = $(e.currentTarget);
};
вы могли бы прочитать currentTarget объекта event, переданного через, например:
function myFunction (event) {
var $this = $(event.currentTarget);
etc etc
};
$('.myClass1').one('keyup', myFunction);
$('.myClass2').one('keyup', myFunction); etc
Попробуй это
function myFunction () {
var $this = $(this);
etc etc
};
var obj= $('.myClass1');
obj.myFunction =myFunction ;
obj.one('keyup', myFunction);
obj.one('keyup', myFunction); etc