JSLint — The JavaScript Verifier
Шеф дал задание пожать все JavaScript-файлы моего текущего проекта и применить к ним обфускацию (запутывание кода программы). Я всё сделал, и проект перестал работать :(
Оказалось, что после проведения указанных мероприятий работа алгоритма может быть нарушена. Самая простая причина — чрезмерная лояльность JavaScript, ведь разделителем команд может быть не только точка с запятой (как в Си или в PHP), но и конец строки — и если две такие стоящие рядом строки «слепить», будет ошибка.
Поскольку на глаз такие места найти трудно в большом количестве файлов, я нашёл полезный он-лайн инструмент JSLint — верификатор кода, указывающий на недочеты ваших скриптов.
Сразу скажу, что я использовал примерно 20% его возможностей :) Я повыключал все галочки, а их много: от проверки на «Strict whitespace» (почему у тебя не 8 пробелов?) до «Disallow ++ and — -» (а вдруг у тебя выражение a+++b в коде встретится?). Я просто вставлял содержимое очередного файла и смотрел, что мне инкреминируют.
Сразу обнаружил несколько минусов, которые смутили:
1. если написать что-то вроде
return some_user_function();
то получаем ошибку «отсутствие new перед вызовом конструктора».
2. C with() не дружим. «Ждали стейтмент, а нашли with, плохо»
3. Прямым текстом написали «eval is evil» («eval суть зло», перевод с английского мой). Я его тоже не люблю, но подобный коммент удивил.
В принципе, все эти моменты описаны в документации, но к чему эти драконовские меры в ежовых рукавицах, я не понял:
JavaScript allowsvar
definitions to occur anywhere within a function.JSLint
is more strict.
Зато после исправления большинства рекомендаций мои пожатые файлы стали работать как раньше, только в размере уменьшились в
Основные моменты, который пришлось править:
- несколько пропущенных точек с запятой после выражений;
- на всякий случай внял подсказкам и позаключал блоки даже с одним оператором в фигурные скобки.
- я использую функцию parseInt, так вот мне было сказано, что нехорошо пропускать второй параметр, который указывает систему счисления для «парсения инта» (radix);
- затесался у меня switch() с одним-единственным case и дефолтом — так вот, я получил рекомендацию заменить его на условный оператор if().
12 коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.