Знак доллара Блюз: JavaScript и PHP

18

Я вырос на программировании на C ++ и Java, где все было безопасно и красиво. Компиляторы позаботились о том, чтобы держать меня под контролем, если я когда-нибудь заблудился. Конечно, в колледже все делали маленький Perl, но я не вдыхал. Дети в наши дни все о PHP на бэкэнде и Javascript на фронте. Пытаясь быть модным, я делаю то же самое (для веб-разработки). Проблема, с которой я продолжаю сталкиваться, заключается в том, что я случайно добавляю знак доллара ($) перед обычными переменными в Javascript, и, конечно, никто ничего не говорит, потому что этот законный синтаксис часто используется для объектов jQuery.

Существуют ли какие-либо средства отладки или хитрости для разработчиков, чтобы уловить путаницу со знаком доллара? Вы часто совершаете одну и ту же ошибку, и как вы справляетесь с ней эмоционально? Инструменты разработчика Chrome не всегда видят это как ошибку Javascript. Я использую PhpStorm и Emacs для разработки, но они не улавливают мою глупость, хотя я подозреваю, что Emacs делает, но предпочитает не говорить мне об этом, несмотря на это.

Если вы считаете этот вопрос смешным, я думаю, что вы правы. Но мы живем в мире, где перед переменной стоит знак доллара. В таком мире нет ничего смешного.

Алан Тьюринг
источник
2
Эмоционально? Просто наброситься на своих коллег.
Крис Шиффхауэр
@ChrisSchiffhauer К сожалению, я работаю в академической среде, где полная и полная изоляция - название игры. Я должен был бы запланировать встречу с коллегой, чтобы продлиться, и это уничтожило бы спонтанность всего этого.
Алан Тьюринг

Ответы:

11

В использовании $переменных нет ничего плохого . Я бы не стал делать это специально для каждой переменной, но это все еще допустимый синтаксис. jQuery является одним из примеров, где $используется в качестве имени переменной. Вот почему «инструменты разработчика Chrome не всегда видят, что это ошибка Javascript» , потому что, во-первых, ошибки нет.

Если вы боитесь писать код вроде:

var demo = function demo() {
    var a = 123;
    ...
    $a = 456; // A new variable is created in global scope.
}

тогда вы должны использовать средство проверки стиля, такое как jsLint , jsHint или Google Closure Linter . Какой из них? Вам решать сделать выбор. Чтобы помочь вам с этим, вот несколько заметок:

Стиль

Google Closure Linter следует Руководству по стилю Google JavaScript , о котором известно, что оно сделано умно. Хорошим вариантом является использование хорошо известного стиля для JavaScript или любого из шести других языков : когда вы делитесь своим кодом или нанимаете нового разработчика, скорее всего, они уже знакомы с этим стилем.

Многим разработчикам знаком и стиль Дугласа Крокфорда. Этот стиль подробно объясняется в JavaScript: The Good Parts , книга, которую стоит купить любому, кто работает с JavaScript.

Что касается jsHint, я не могу найти, какие соглашения используются, и сам сайт, кажется, избегает говорить на эту тему. Может быть, я что-то пропустил.

Поддержка IDE

И jsLint, и jsHint поддерживаются PhpStorm. Это также относится и к Google Closure Linter.

Окружающая обстановка

Google Closure Linter является одним из серии инструментов . Если вы уже используете Google Closure Compiler или Google Closure Library , было бы предпочтительнее выбрать Closure Linter над другими инструментами.

взыскательность

jsLint, как известно, строгий. jsHint более терпим, что не всегда хорошо. Например, одна из причин для разветвления jsLint для jsHint объясняется в статье, в которой показан плохой код, который приведет к ошибке в jsLint, но не в jsHint:

/*global jQuery */

// Example taken from jQuery 1.4.2 source
jQuery.extend({
    /* ... */

    isEmptyObject: function( obj ) {
        for ( var name in obj ) {
            return false;
        }
        return true;
    }

    /* ... */
});

Код плохой, потому что похоже, что JavaScript имеет область видимости блока, а его нет. См. JavaScript: Хорошие части, с. 102, Приложение A: Ужасные Части, Область применения. Другими словами, глядя на код, не зная языка, мы ожидаем, nameчто он не будет виден вне цикла, пока он останется видимым.

Что касается Google Closure Linter, я считаю, что он находится где-то посередине между jsLint и jsHint, но у меня недостаточно информации для его поддержки.

Вывод

Я бы избегал jsHint: он слишком разрешительный, что означает, что он не найдет потенциальных ошибок, которые обнаружат другие линтеры. Руководство по стилю, которое используется, трудно найти.

Среди jsLint и Google Closure Linter выбор не очевиден. Оба написаны экспертами, оба следуют строгому, хорошо описанному руководству по стилю, которому уже следуют тысячи разработчиков. Используйте оба в течение некоторого времени, затем выберите тот, который более практичен для вас.

Арсений Мурзенко
источник
+1: бей меня к этому. Я начал сбрасывать точки с запятой, когда я переключаю языки с F # на C #, так что я могу поделиться с вами вашей болью;)
scrwtp
2
Просто примечание, так как OP использует PhpStorm: JSLint и JSHint интегрированы и могут быть настроены для проверки их кода по требованию или даже на лету. Ошибки, подобные той, что в вашем примере, довольно легко обнаружить.
Яннис