Javascript/jsLint: что заменить jQuery (this) при использовании "use strict";
когда я проверяю следующий код с помощью jslint, я получаю следующие ошибки.
function displayMegaDropDown() {
"use strict";
var liMegaPosition, divMegaOffset;
liMegaPosition = jQuery(this).position();
divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liMegaPosition.left };
jQuery(this).find("div").offset(divMegaOffset);
jQuery(this).addClass("hovering");
}
проблема в строке 4 символ 29: строгое нарушение.
liMegaPosition = jQuery(this).position();
проблема в строке 5 символ 56: строгое нарушение.
divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liM...
проблема в строке 6 символ 12: строгое нарушение.
jQuery(this).find("div").offset(divMegaOffset);
проблема в строке 8 символ 12: строгое нарушение.
jQuery(this).addClass("hovering");
Я предполагаю, что это из-за использование jQuery (это), но я не понимаю, чем его заменить. Обратите внимание, что это не потому что jQuery не объявлен как глобальный.
4 ответов
Я думаю, проблема в том, что вы используете this
не внутри метода. Следующий код
/*global jQuery */
var myObj = {
myNethod: function displayMegaDropDown() {
"use strict";
var ts = jQuery(this),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
}
};
или
/*global jQuery */
function displayMegaDropDown(t) {
"use strict";
var ts = jQuery(t),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
}
даст вам никаких ошибок или предупреждений.
обновлено: еще одна версия, которая очень близка к оригинальной, также не ошибок или предупреждений:
/*global jQuery */
var displayMegaDropDown = function () {
"use strict";
var ts = jQuery(this),
liMegaPosition = ts.position(),
divMegaOffset = {
top: liMegaPosition.top + ts.height(),
left: liMegaPosition.left
};
ts.find("div").offset(divMegaOffset);
ts.addClass("hovering");
};
обновлено 2: я нахожу вопрос интересным для понимания. Поэтому я смотрю сквозь в ECMAScript стандарт . Я нахожу следующее в "приложении C (информативном) строгий режим ECMAScript" (см. Лучше в HTML-версии здесь):
если этой оценивается в строгом коде режима, затем этой значение не принуждают к объекту. А этой стоимостью null или неопределено не преобразование в глобальный объект и примитивные значения не преобразуются прессподборщик объекты. The этой значение, переданное через вызов функции (включая звонки, сделанные с помощью и возможность использования
this
на выражение функции кажется подозрительным для многих людей. Сегодня я получил еще один комментарий по этому поводу. Поэтому я создал очень простую демо/*jslint devel: true */ (function () { 'use strict'; function test() { alert(this); } test(); }());
вы можете проверить это здесь что в IE9 демонстрационное предупреждение с текстом "[окно объекта]" и в текущих версиях Chrome и Firefox вы увидите "undefined".
проблема с использованием
this
на заявление это не "вещь jslint". Это реальная проблема, которую вы должны учитывать при разработке ваших программ JavaScript.Я лично предпочитаю использовать выражение функции и почти никогда не использовать больше инструкции функции. Я думаю, что люди, которые приходите из других языков программы (как и я) попробуйте в начале использовать ту же конструкцию, которая была хороша на ваших любимых языках. Только позже выясняется, что определение переменных в блоке плохое (в JavaScript нет области уровня блока) и что инструкции функции не всегда лучший выбор.
родным javascript,this
будет undefined
на strict mode
если функция содержит, она также не вызывается:
- как метод объекта
- by
Function.call
илиFunction.apply
- как конструктор
вот почему jshint жалуется на это.
однако, если функция используется в качестве обработчика событий для jQuery, jQuery заставит $(this)
как объект jQuery DOM, который запускает событие.
чтобы доказать это, откройте консоль этой страницы и выполните следующий код.
(function(){
"use strict";
function event_handler() {
$(this).css('background','red');
}
$('#content').on('click', 'table', event_handler);
})();
нажмите любой вопрос или ответ этой страницы, и вы увидите, что фон становится красным.
гораздо проще! Просто используйте эВ.currentTarget вместо этого. Это то же самое, что вы можете проверить с ===
function event_handler(ev) {
//var $el = $(this); // jshint - error
var $el = $(ev.currentTarget); // is exactly the same as above
}