Я работаю над плагином для jQuery, и я получаю эту ошибку JSLint:
Problem at line 80 character 45: Do not use 'new' for side effects.
(new jQuery.fasterTrim(this, options));
У меня не было большой удачи при нахождении информации об этой ошибке JSLint или о любых побочных эффектах это new
мог бы иметь.
Я попытался Гуглить для, "Не используют 'новый' для побочных эффектов". и получил 0 результатов. Дребезжание дает мне 2 результата, но они оба просто ссылаются на источник JSLint. Надо надеяться, этот вопрос изменит это.:-)
Обновление № 1: вот больше источника для контекста:
jQuery.fn.fasterTrim = function(options) {
return this.each(function() {
(new jQuery.fasterTrim(this, options));
});
};
Обновление № 2: Я использовал Начинающего генератор плагина jQuery в качестве шаблона для моего плагина, который имеет тот код в нем.
Трэвис, я разработчик Стартовый
сайт.
@Pointy попал в точку. Причина, по которой стартовый код написан таким образом, заключается в том, что нам действительно нужен новый объект, нам просто не нужно хранить ссылку на него в этой точке.
Простое изменение команды с
(new jQuery.fasterTrim(this, options));
на
var fT = new jQuery.fasterTrim(this, options);
успокоит JSLint, как вы обнаружили.
Настройка подключаемого модуля Starter следует шаблону пользовательского интерфейса jQuery для сохранения ссылки на объект в данных
, установленных для элемента. Итак, вот что происходит:
: $ (el).data ('FasterTrim', this)
Возвращаемый объект бесполезен, поэтому объявление var
не сделано. Я постараюсь изменить объявление и очистить вывод, чтобы передать JSLint прямо из коробки.
Еще немного предыстории :
Преимущество сохранения объекта с использованием данных
заключается в том, что мы можем получить доступ к объекту позже в любое время, вызвав: $ ("# your_selector ") .data ('FasterTrim')
. Однако, если ваш плагин не нуждается в доступе в середине потока таким образом (это означает, что он настраивается за один вызов и не предлагает никакого взаимодействия в будущем), то сохранение ссылки не требуется.
Дайте мне знать, если вам понадобится дополнительная информация.
Сам JsLint дает вам причину:
Конструкторы - это функции, которые предназначены для использования с новым {{ 1}} префикс. Новый префикс создает новый объект на основе прототипа функции и связывает этот объект с подразумеваемым этим параметром функцией. Если вы не используете новый префикс, новый объект не будет создан, и этот будет привязан к глобальному объекту. Это серьезная ошибка.
JSLint обеспечивает соблюдение соглашения о том, что функциям-конструкторам присваиваются имена с начальным верхним регистром. JSLint не ожидает увидеть вызов функции с начальным именем в верхнем регистре, если он не имеет нового префикса. JSLint не ожидает увидеть новый { Префикс {1}}, используемый с функциями, имена которых не начинаются с начального верхнего регистра. Этим можно управлять с помощью параметра newcap .
JSLint не ожидает увидеть, что оболочка формирует новое число, новую строку, новое логическое значение.
JSLint не ожидает увидеть новый объект (используйте вместо него {}).
JSLint не ожидает увидеть новый массив (используйте вместо него []).
Он жалуется, потому что вы называете «новый», но потом выбрасываете возвращенный объект, держу пари. Почему в этом коде используется слово «новый»? Другими словами, почему бы не просто
jQuery.fasterTrim(this, options);
edit Хорошо, что инструмент "Starter" генерирует код таким образом, потому что он действительно хочет, чтобы был создан новый объект, и да, он действительно должен воспользоваться эффекты. Код конструктора, который генерирует «Starter», хранит ссылку на новый объект в затронутом элементе, используя средство «data» jQuery.
Вы используете new
для выполнения некоторых действий, а не для создания объекта и его возврата. JSLint считает это недопустимым использованием new
.
Вы должны использовать его так:
var x = new SomeConstructor();
Или выполнить какое-нибудь действие, подобное этому:
SomeMethod();
Но никогда не используйте new для выполнения такого действия:
new SomeCosntructor(args);
Это считается использованием new
для побочных эффектов, потому что вы не используете его для создания объекта.
В основном JavaScript имеет тенденцию быть медленным зверем, поэтому создание нового объекта только для вызова функции довольно неэффективно. В любом случае функция статическая.
$.fasterTrim(this, options);
Из Исходный код jQueryfastTrim :
* Usage:
*
* $(element).fasterTrim(options); // returns jQuery object
* $.fasterTrim.trim(" string ", options); // returns trimmed string
Чтобы ответить на вопрос, «Не использовать new для побочных эффектов» означает:
Не использовать new для того, что конструктор будет работать со своими параметрами , но для создания объекта побочные эффекты в конструкторах - баааад!