2014-01-16 6 views
7

У меня есть автономная реализация Backbone.View под названием MainControllerView, которая может обрабатывать себя (т. Е. Нет причин иметь внешнюю ссылку на нее). Если в моей главной функции загрузчика я пнуть вещи, как это:Использует ли Backbone.js «новое для побочных эффектов» вопреки JSHint?

$(function() { 
    new MainControllerView(); 
}); 

JSLint/JSHint жалуются, что я использую «новые побочные эффекты.» Чтение этого предупреждения указывает на то, что вышеупомянутое считается вонючим кодом. Альтернативы - не использовать новые вообще и просто вызывать конструктор как функцию или назначать его переменной. Тем не менее, вызов моего MainControllerView() непосредственно как функция без использования new вызывает ошибки в базовом коде, поэтому это, по-видимому, не вариант. И его, кажется, совершенно неправильно для меня, что следующий как-то лучше код:

$(function() { 
    var instantGarbage = new MainControllerView(); 
}); 

На самом деле это вызывает другое предупреждение JSLint «instantGarbage определен, но никогда не используется.» По-видимому, меня отменяют, если я это сделаю, и меня отменяют, если я этого не делаю. Итак, есть ли другой «правильный» способ справиться с такими вещами? Является ли создание мгновенных переменных мусора как-то альтернативой «лучшего кода»? Является ли Backbone.js ключевым словом «новое» не одобренным Крокфордом? Или это только одно из исключений из «правила»?

+0

возможно дубликат [считаются вредным JavaScript «s "новые" ключевые слова?] (Http://stackoverflow.com/questions/383402/is-javascript-s- новый-ключевое слово-считается-вредным) – tkone

+0

Не совсем дубликат. Я не спрашиваю, является ли новый вред сам по себе, я спрашиваю, есть ли проблема использовать его, не присваивая его переменной. –

ответ

9

new не является вредным. Повторяйте снова и снова.

Если используется правильно, new работает очень хорошо. Как в Магистраль.

JSLint - очень упрямый линтер; просто потому, что Крокфорд говорит, что что-то плохое или его нельзя использовать, не означает, что это универсальная правда. Кроме того, его аргументация позади этого больше в конце, что она скрывает прототипную природу Javascript за более классическим фасадом.

Однако, если вы используете такой инструмент, как JSHint, вы можете настроить эти предупреждения.

Я предпочитаю последний из двух ваших заявлений

$(function() { 
    var instantGarbage = new MainControllerView(); 
}); 

Вы можете подавить это с unused: false опции к JSHint.

Или вы можете установить nonew: false вместо этого.

Они могут быть установлены в файле каждого .jshintrc или даже с комментарием:

/* jshint unused: false */ 

В верхней части файла. Это отключит файл. Вы даже можете отключить его для определенных областей.

Отъезд jshint documentation

1

Ok первую очередь Crockford это человеческое существо с мнением; ни больше ни меньше. Многие люди не согласны со многими его мнениями, поэтому библиотека JSHint намного более популярна, чем JSLint, хотя преимущество JSLint было в том, что он стал первым.

Я настоятельно рекомендую переключиться на JSHint, чтобы вы перестали беспокоиться о глупых вещах, о которых заботится Crockford, которые на самом деле не делают ваш код хуже.

+1

На самом деле я использую JSHint, и это одно предупреждение, которое пережило вилку. Разумеется, я могу отключить его в JSHint, что я и сделаю, но раньше я хотел лучшего понимания. Благодаря! –

+0

О, не понял, что кто-то сделал это в JSHint (я, должно быть, отключил его в своей конфигурации и забыл). – machineghost

1

Посмотрите на это от кого-то другого, читающего ваш код в первый раз.Конструкторы, как правило, используются для создания нового объекта, который вы затем выполняете. Глядя на это, кажется, что вы просто создаете новый вид и сразу бросаете его, не делая ничего.

Так что да, с или без JS [L/H] int, это «плохой запах кода». Посмотрите на этой статье -

http://tmont.com/blargh/2014/4/constructors-should-not-have-side-effects

Смежные вопросы