четверг, 25 апреля 2013 г.

Тестирование JavaScript Node.js

Для тестирования JavaScript рекомендуется использовать Chai вместе Mocha на Node.js.

devDependencies: {
  "chai": "*",
  "mocha": "*" // our preference, but you can use any test runner you like
}

среда, 24 апреля 2013 г.

4 способа создания и 5 способов наследования классов в JavaScript

4 способа создания объектов в JavaScript

1. Factory Pattern

function createPerson(name, age, job){
    var o = new Object();
         o.name = name;
         o.age = age;
         o.job = job;
         o.sayName = function(){
             alert(this.name);
         };
    return o;
}

var person1 = createPerson('Nicholas', 29, 'Software Engineer');
var person2 = createPerson('Greg', 27, 'Doctor');

2. Constructor Pattern

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    };
}

var person1 = new Person('Nicholas', 29, 'Software Engineer');
var person2 = new Person('Greg', 27, 'Doctor');

alert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true

alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true

3. Prototype Pattern

function Person(){} // или var Person = function(){}

Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function(){
    alert(this.name);
};

Или другой вариант

function Person(){}

Person.prototype = {
    name : 'Nicholas',
    age : 29,
    job : 'Software Engineer',
    sayName : function () {
        alert(this.name);
    }
};

var person1 = new Person();
var person2 = new Person();

person1.sayName(); // "Nicholas"
person2.sayName(); // "Nicholas"

alert(person1.sayName == person2.sayName); //true

alert(Person.prototype.isPrototypeOf(person1)); //true
alert(Person.prototype.isPrototypeOf(person2)); //true

4. Module Pattern

var MyClass = (function($, _){

    // Определение свойств класса
    var prop1 = 1;
    var prop2 = 2;

    // Определение частных (private - закрытых для внешнего доступа) методов
   function private_method1() {return 4};
   function private_method2() {return 5};

    // Определение публичных (public - доступных для внешнего доступа) методов класса
    return {
         method1: function(){console.log(prop1);},
         method2: function(){console.log(prop2);},
         method3: function(){prop1 = 3;},
         method4: function(){return private_method1() + private_method2();}
    };

})(jQuery, underscore);

MyClass.method1(); // 1
MyClass.method2(); // 2
MyClass.method3(); // prop1 = 3
MyClass.method1(); // 3
MyClass.method4(); // 9

Или другой вариант

var Greeter = (function () {

    // Название класса Greeter
    function Greeter(message) { // message - переменная, подставляемая при создании объекта класса
        this.greeting = message;   // Определение атрибута greeting класса Greeter
    }

    // Метод класса Greeter
    Greeter.prototype.greet = function () { // Метод greet
        return "Hello, " + this.greeting;
    };

    return Greeter; // Инициализация класса Greeter

})();

var greeter = new Greeter("world"); // Создание объекта из класса Greeter

greeter.greet();

5 способов наследование классов в JavaScript

1. Наследование через прототип

function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

var person = {
    name: 'Nicholas',
    friends: ['Shelby', 'Court', 'Van']
};

var anotherPerson = object(person);
     anotherPerson.name = 'Greg';
     anotherPerson.friends.push('Rob');

2. Улучшенное наследование через прототип

function ExtendClass (ChildClass, ParentClass)
{
    var BaseParentClass = function(){};
          BaseParentClass.prototype = ParentClass.prototype;

    var TemporaryParentClass = new BaseParentClass();
   
    for (var property in ChildClass.prototype) {
        TemporaryParentClass[property] = ChildClass.prototype[property];
    }

    ChildClass.prototype = TemporaryParentClass;
    ChildClass.prototype.super = ParentClass.prototype;
}

3. Наследование внутри модуля

var ExtendClass = this.ExtendClass || function (ChildClass, ParentClass) {

    function F() { this.constructor = ChildClass; }
    F.prototype = ParentClass.prototype;
    ChildClass.prototype = new F();

};


var ManlyTruck = (function (ParentClass) {

    ExtendClass(ManlyTruck, ParentClass);

    function ManlyTruck(engine, bigTires) {

        ParentClass.call(this, engine);

        this.bigTires = bigTires;

    }

    return ManlyTruck;

})(Auto);


var Auto = (function () {

    function Auto(engine) {
        this.engine = engine;
    }

    return Auto;

})();

4. Наследование через new Object.create()

Object.create() поддерживается только в Internet Explorer 9+, Firefox 4+, Safari 5+, Opera 12+ и Chrome.

var person = {
    name: 'Nicholas',
    friends: ['Shelby', 'Court', 'Van']
};

var anotherPerson = Object.create(person, {
    name: {
        value: 'Greg'
    }
});

alert(anotherPerson.name); // "Greg"

5. Комбинированный способ наследования

Функция Extend() возвращает вновь созданный объект, наследующий свойства родителя.
Внутри используется функция Object.create() из ECMAScript 5, если она определена, иначе используется старый метод.

function Extend(Parent){

    if (Parent == null) {throw TypeError(); // Родитель не может быть значением Null

    if (Object.create){return Object.create(Parent);} // Наследовать свойства родителя, если  Object.create() определена

    var ParentType = typeof Parent; // Иначе выяснить тип родителя
    if (ParentType !== 'object' && ParentType !== 'function') {throw TypeError();}
   
    // Использовать старый метод наследования
    function F(){}
    F.prototype = Parent;
    return new F():
   
}

var Parent = {a: 1};

var Child = Extend(Parent);

Child.a;

Работа со свойствами класса

Копирование перечислимых свойств из объекта родителя в объект потомок c затиранием свойства потомка.

Если родитель и потомок имеют свойства с одинаковыми именами, то значение свойства потомка затирается свойством родителя.
Эта функция не учитывает наличие методов доступа и не копирует атрибуты.

function Extend(Child, Parent){
    for (property in Parent){
        Child[property] = Parent[property];
    }
    return Child;
}

Копирование перечислимых свойств из объекта родителя в объект потомок c сохранением исходных свойств потомка.

Если родитель и потомок имеют свойства с одинаковыми именами, то значение свойства потомка остаются неизменными.
Эта функция не учитывает наличие методов доступа и не копирует атрибуты.

function Extend(Child, Parent){
    for (property in Parent){
        if (Child.hasOwnProperty[property]) {continue;}
        Child[property] = Parent[property];
    }
    return Child;
}

Удаление из объекта потомка свойств, отсутствующих в объекте родителе.

function Deletion(Child, Parent){
    for (property in Child){
        if (!(property in Parent)) {delete Child[property];}
    }
    return Child;
}

Удаление из объекта потомка свойств, присутсвующих в объекте родителе.

function Deletion(Child, Parent){
    for (property in Parent){
        delete Child[property];
    }
    return Child;
}

Опции JSHint


bitwise
В коде используются побитовые операции  ^, &, |, а не только && или ||
camelcase
Все переменные должны быть в стиле camelCase и UPPER_CASE
curly
Фигурные скобки {} должны быть в условиях и циклах
eqeqeq
Для сравнения значений должны использоваться только === и !===
forin
Проверять фильтруются ли в циклах for-in значения.

Пример

for (key in obj) {
  if (obj.hasOwnProperty(key)) {
    // We are sure that obj[key] belongs to the object and was not inherited.
  }
}

immed
Эта опция запрещает использование немедленного вызова функции без упаковки ее в круглые скобки. Упаковка в круглые скобки помогает читателям вашего кода в понимании того, что выражение является результатом функции, а не самой функцией.
indent
Для отступов должно быть использовано не менее 4-х пробелов
latedef
Эта опция запрещает использование переменной прежде чем она была определена.
newcap
Эта опция требует, чтобы имена функций-конструкторов начинались с больших букв.
noarg
Эта опция запрещает использование arguments.caller и arguments.callee.
noempty
Эта опция предупреждает когда у вас есть пустой блок в вашем коде.
nonew
Эта опция запрещает использование функции конструктора без присвоения его переменной.

new MyConstructor ();
plusplus
Эта опция запрещает использование  + + и --  в коде
quotemark
Эта опция обеспечивает согласованность кавычек во всем коде. Она принимает три значения:

true - если вы не хотите, чтобы было использование одного конкретного стиля

"single" - если вы хотите разрешить только одинарные кавычки

"double" - если вы хотите разрешить только двойные кавычки
undef
Эта опция запрещает использование явно необъявленных переменных.
unused
Эта опция предупреждает о наличии нигде не используемых переменных.
strict
Эта опция обязывать писать весь код с соблюдением правил строгого режима ECMAScript 5
trailing
Эта опция сообщает об оставленных пробелах в конце строк кода.
maxparams
Эта опция позволяет установить максимальное количество формальных параметров разрешенных для функций.
maxdepth
Эта опция позволяет контролировать количество вложенных блоков кода друг в друга
maxstatements
Эта опция позволяет установить максимальное количество передложений разрешеных внутри функций.
maxcomplexity
Эта опция позволяет контролировать цикломатические сложности во всем коде.
maxlen
Эта опция позволяет установить максимальную длину строки.
asi
Эта опция подавляет предупреждения об отсутствии точки с запятой.
boss
Эта опция подавляет предупреждения о присвоении значения переменной там, где ожидается условие сравнения

if (a = 10) {}


Но это может быть полезно в данном случае

for (var i = 0, person; person = people[i]; i++) {}


debug
Эта функция подавляет предупреждения о наличии предложений дебаггера в вашем коде.
eqnull
Эта опция подавляет предупреждения о == NULL сравнений. Такие сравнения часто бывают полезными,  когда вы хотите  проверить является ли значение переменной null или undefined.
es5
Эта опция говорит JSHint, что ваш код использует ECMAScript 5 конкретного синтаксиса, получения и установки.
esnext
Эта опция говорит JSHint, что ваш код использует ECMAScript 6 конкретных функций, таких как константы.
evil
Эта опция подавляет предупреждения об использовании Eval.
expr
Эта опция подавляет предупреждения об использовании выражений, где обычно вы ожидаете увидеть присваивания или вызовы функций.
funscope
Эта опция подавляет предупреждения об объявлении переменных внутри структуры управления при обращениях к ним позже извне.

function test() {
  if (true) {
    var x = 0;
  }
 
  x += 1; // Default: 'x' used out of scope.
                            // No warning when funcscope:true
}

globalstrict
Эта опция подавляет предупреждения об использовании глобального строгого режима.
iterator
Эта опция подавляет предупреждения об использовании свойства __ iterator __
lastsemic
Эта опция подавляет предупреждения об отсутствии точки с запятой, но только тогда, когда точка с запятой опускается для последней инструкции в одну строку блока:
var name = (function() { return 'Anton' }());

laxbreak
Эта опция подавляет большую часть предупреждений о возможно небезопасным разбиении и переносе строк. Он не подавляет предупреждения с запятыми первого стиля кодирования. Для подавления тех, вы должны использовать laxcomma (см. ниже).
laxcomms
Эта опция подавляет предупреждения о запятых стоящих спереди:

var obj = {
    name: 'Anton'
  , handle: 'valueof'
  , role: 'SW Engineer'
};

loopfunc
Эта опция подавляет предупреждения относительно функций внутри циклов.

ar nums = [];
 
for (var i = 0; i < 10; i++) {
  nums[i] = function (j) {
    return i + j;
  };
}
 
nums[0](2); // Prints 12 instead of 2

multistr
Эта опция подавляет предупреждения о многострочных строках.

var text = "Hello\
World"; // All good.
 
text = "Hello
World"; // Warning, no escape character.
 
text = "Hello\ 
World"; // Warning, there is a space after \

proto
Эта опция подавляет предупреждения об использовании свойства __ proto __.

scripturl
Эта опция подавляет предупреждения об использовании  целевых URL-адресов-сценариев, таких как JavaScript: ....
smarttabs
Эта опция подавляет предупреждения об использовании смешанных табуляций и пробелов, когда последние используются для только для выравнивания.
shadow
Эта опция подавляет предупреждения о переменной затенения т.е. объявления переменной, которая была уже объявлена где-то во внешней области.
sub
Эта опция подавляет предупреждения об использовании [] обозначения, когда оно может быть выражено в точечной нотации: person['name' ] против person.name
supernew
Эта опция подавляет предупреждения об "ужасных" конструкциях вида
new function () { ... } и new Object;
validthis
Эта опция подавляет предупреждения о возможных нарушениях когда код выполняется в строгом режиме, и вы используете это в не функции конструктора.
browser
Эта опция определяет глобальные переменные, используемые браузерами, такие как document и navigator
couch
Эта опция определяет глобальные переменные, используемые CouchDB.
devel
Эта опция определяет глобальные переменные, которые обычно используются для логирования и  отладки: console, alert и т.д.
dojo
Эта опция определяет глобальные переменные, доступные в Dojo Toolkit.
jquery
Эта опция определяет глобальные переменные, доступные в jQuery.
mootools
Эта опция определяет глобальные переменные, доступные в MooTools.
node
Эта опция определяет глобальные переменные доступные, когда ваш код выполняется внутри Node.js.
nonstandart
Эта опция определяет глобальные переменные такие как escape и unescape.
prototypejs
Эта опция определяет глобальные переменные, доступные в Prototype Framework.
rhino
Эта опция определяет глобальные переменные доступные, когда ваш код выполняется внутри Rhino.
worker
Эта опция определяет глобальные переменные доступные, когда ваш код выполняется внутри Web Worker.
wsh
Эта опция определяет глобальные переменные доступные, когда ваш код выполняется в виде сценария для Windows Script Host.
yui
Эта опция определяет глобальные переменные, доступные в YUI Framework.
nomen
Эта опция запрещает использование символа _ в названиях переменных.  Мы не знаем, зачем вам это нужно.
onevar
Эта опция позволяет только одно заявление на Var функции.

Пример
var b, f, i, j, p, seen = {}, t;
passfail
Эта опция заставляет JSHint прервать дальнейшую проверку при первой же остановке и выдаче предупреждения.
white
Эта опция заставляет JSHint проверить исходный код JavaScriptна соблюдение стиля кодирования Дугласа Крокфорда.


Параметры с жёсткими ограничениями
Эти параметры указывают JSHint-у более строго проверять ваш код. Используйте их, если вы хотите разрешить использовать только безопасные конструкции языка. Это полезно, когда код пишется большим числом разработчиков с разным уровнем знаний.
  • bitwise
    Этот параметр запрещает использование побитовых операторов, такие как ^ (исключающее или), | (или) и другие. Могут быть две причины, по которым вы захотите включить этот параметр:
    1. Т.к. JavaScript не имеет целочисленных переменных (только с плавающей точкой двойной точности), побитовые операторы с ними происходят очень медленно.
    2. Побитовые операторы редко используются в программах на JavaScript, и зачастую, к примеру, & — это пропущенный символ в &&.
  • curly
    Этот параметр заставляет всегда тело условий и циклов заключать в фигурные скобки. JavaScript позволяет опускать фигурные скобки, когда блок состоит только из одного оператора, к примеру:
    while (day)
    shuffle();
    Однако, в некоторых случаях такая конструкция может привести к ошике:
    while (day)
    shuffle();
    sleep(); // Можно подумать, что это часть цикла, но это не так.
    Вообще, если вы аккуратно пишите код, то лучше всегда требовать обрамлять блоки скобками.
  • eqeqeq
    Этот параметр запрещает использовать == и != в пользу === и !==. Эти операторы пытаются всегда приводить операнды к одному типу, в результате чего можно получить неожиданный результат. Последние не делают приведения, следовательно являются более безопасными. Если вы хотите узнать больше о приведении типов в JavaScript, рекомендуем ознакомиться с
    Truth, Equality and JavaScript (Angus Crol).
    Примечание: даже если этот параметр выключен, JSHint все равно будет проверять небезопасное сравнение вида != null, если eqnull (см. ниже) включён!
  • forin
    Этот параметр требует, чтобы во всех for in циклах выбирались только элементы объекта. Цикл for in перебирает все свойства объекта, в том числе и унаследованные. Это может привести к получению неожиданного свойства объекта. Обычно безопаснее фильтровать унаследованные свойства, например:
    for (key in obj) {
    if (obj.hasOwnProperty(key)) {
    // Мы уверены, что obj[key] относится к текущему обхекту, а не унаследован.
    }
    }
    Для лучшего понимания for in циклов в JavaScript, прочтите Exploring JavaScript for-in loops (Angus Croll).
  • immed
    Этот параметр запрещает вызывать объявленную функцию, не обрамив ее скобками. При обрамлении скобками, становится понятно, что выражение — это результат функции, а не сама функция.
  • latedef
    Этот параметр запрещает использование переменных до их объявления. JavaScrit позволяет объявлять переменные в любом месте, при этом, при исполнении кода, они все поднимаются в самый верх. Такое поведение может привести к непонятным ошибкам, поэтому использование этого параметра делает код более безопасным, разрешая использовать переменные только после их явного предварительного объявления.
    Для лучшего понимания области видимости переменных и их объявлении в JavaScrip, прочтите
    JavaScript Scoping and Hoisting (Angus Croll).
  • newcap
    Этот параметр требует обязательно использовать оператор new перед функциями — конструкторами. Тк функции — конструкторы объявляются как и обычные функции, есть возможность вызвать такую функцию на исполнение, вместо того, чтобы создать объект, это, зачастую, является ошибкой, в особенности, когда в теле функции присутствует this.
    Отсутствие оператора new не вызовет никаких ошибок исполнения, и выявление такой ошибки будет затруднительным. А ошибка будет серьёзной, тк при вызове функции без оператора new, указатель this будет указывать не на создаваемый объект, а на глобальный.
    Пример
    :
    function MyConstructor() {
    console.log(this);
    }new MyConstructor(); // -> [MyConstructor]
    MyConstructor(); // -> [DOMWindow]
    Для лучшего понимания, как работает this, прочтите Understanding JavaScript Function Invocation and «this» (Yehuda Katz).
  • noarg
    Этот параметр запрещает использование arguments.caller и arguments.callee. При их использовании, становится невозможным использовать множество оптимизаций, поэтому они объявлены устаревшими в новых версиях JavaScript. Также EcmaScript 5 запрещает использовать argumants.callee в строгом режиме.
  • noempty
    Этот параметр предупреждает, если в коде есть пустой блок. HSLint всегда делал такие предупреждения, мы сделали этот опциональным. В любом случае, не было случаев, чтобы пустой блок приводил к ошибке в программе.
  • nonew
    Этот параметр запрещает вызывать конструктор, создавая объект, но нигде его не сохранив. Некоторые вызывают конструктор, не сохранив созданный объект в переменной, к примеру так:
    new MyConstructor();
    Такой подход не имеет смысла, поэтому вы должны избегать таких конструкций.
  • plusplus
    Этот параметр запрещает использование унарных операторов инкремента и декремента. Некоторые считают, что использование ++ и — это плохой стиль программирования, к примеру разработчики на Python, где такие операторы отсутствуют.
  • regexp
    Этот параметр запрещает использовать . в регулярных выражениях, что может быть опасным.
  • undef
    Этот параметр запрещает использовать не объявленные переменные. Этот параметр очень полезен, при поиске случаев, когда переменные создаются или используются глобально. Пример:
    /*jshint undef:true */function test() {
    var myVar = ‘Hello, World’;
    console.log(myvar); // Здесь JSHint будет ругаться на неизвестную функцию
    }Если переменная (функция) объявлена где-то в другом файле, то вы должны использовать конструкцию /*global … */ чтобы сообщить JSHint-у об этом. Польше информации ищите
    тут.
  • strict
    Этот параметр требует, чтобы код был написан в соответствии с строгим режимом EcmaScript 5.
    Строгий режим запрещает использование некоторых конструкций JavaScript. При этом, строгий режим позволяет избежать появления некоторых ошибок и позволяет производить некоторые оптимизации кода.
    Примечание: этот параметр использует строгий режим только внутри области видимости функции, и запрещает использовать его глобально, тк это может нарушить работу прочих компонентов. Если вы хотите использовать строгий режим глобально, воспользуйтесь параметром globalstrict.
  • trailing
    Этот параметр будет выдавать ошибку в случае, когда у вас в конце строки есть пробелы. Такие пробелы могут стать источником ошибок в многострочном тексте, к примеру:
    // Здесь действительно может возникнуть ошибка,
    // если после \ будет стоять пробел
    var str = «Hello \
    World»;
Параметры с мягкими ограничениями
Эти параметры позволяют подавлять некоторые сообщения об ошибках. Используйте их только в том случае, когда вы полностью уверены в том, что делаете.
  • asi
    Этот параметр подавляет сообщения об ошибке, вызванной пропущенной точкой с запятой. Довольно много людей опасаются писать код без использования точки с запятой. Распространено мнение, что использование точки с запятой является обязательным в JavaScript (но это не так). JavaScript имеет свои правила по поводу использования точки с запятой, и их придерживаются все браузеры. Так что использовать этот параметр, или нет — это ваше дело.
    Больше информации по использованию точки с запятой в JavaScript вы можете прочитать в
    An Open Letter to JavaScript Leaders Regarding Semicolons (Isaac Schlueter) и JavaScript Semicolon Insertion.
  • boss
    Этот праметр подавляет сообщения об ошибке в случае, когда ожидается сравнение, но его не происходит. Чаще всего код вида if (a = 10) {} является опечаткой. Тем не менее, подобная конструкция может быть полехна в подобных случаях:
    for (var i = 0, person; person = people[i]; i++) {}
  • debug
    Этот параметр подавляет сообщения об ошибке, если в коде встречается ключевое слово debugger.
  • eqnull
    Этот параметр подавляет сообщения об ошибке в случае использования сравнения вида == null. Такое сравнение может быть полезным, если вы хотите узнать, значение переменной null или undefined.
  • es5
    Этот параметр сообщает JSHint-у, что ваш код использует возможности EcmaScript 5, такие как геттеры и сеттеры. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.
    Больше
    информации:
    1.
    ES5 compatibility table (Juriy Zaytcev)
    2.
    ECMAScript 5 support in Mozilla
  • esnext
    Этот параметр сообщает JSHint-у, что ваш код использует возможности ES.next, такие как const и let. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.
    Больше информации:
    1.
    Draft Specification for ES.next (ECMA-262 Ed. 6)
  • evil
    Этот параметр подавляет сообщения об ошибке при использовании eval. Использовать eval не рекомендуется, тк он делает код уязвимым для различных инъекций, так же затрудняет работу оптимизаторам.
  • expr
    Этот параметр подавляет сообщения об ошибке в случае, где обычно ожидается присваивание или вызов функции. Обычно такое случается в следствие опечатки, однако это не запрещается спецификацией.
  • funcscope
    Этот параметр подавляет сообщения об ошибке в случае, когда переменная была объявлена в некоторой области видимости, а после запрашивается уже вне её. Вообще, в JavaScript существует как локальная область видимости, так и глобальная, подобная запись может привести в замешательство малоопытных разработчиков, также усложняет процесс отладки. JSHint выдаёт предупреждения, если используется переменная вне предполагаемой области видимости. Пример:function test() {
    if (true) {
    var x = 0;
    }x += 1; // ’x’ используется вне предполагаемой области объявления.
    // предупреждение не будет выведено, если выставить funcscope:true
    }
  • globalstrict
    Этот параметр подавляет сообщения об ошибке в случае использования строгого режима глобально. Глобальный строгий режим может не пропустить сторонний код, написанный в обычном режиме.
    Больше информации вы можете получить прочитав о параметре strict.
  • iterator
    Этот параметр подавляет сообщения об ошибке в случае использования свойства __iterator__. Это свойство поддерживается не всеми браузерами, и пользоваться им нужно с осторожностью.
  • lastsemic
    Этот параметр подавляет сообщения об ошибке при отсутствии точки с запятой в выражении, если оно записано с блоком в одну строку. Пример:
    var name = (function() { return ‘Anton’ }());
    Это удобно использовать в случае автоматической генерации JavaScript кода.
  • laxbreak
    Этот параметр подавляет большинство сообщений об ошибке в коде, где есть подозрения на неправильно записанную строку. Но при этом не подавляются предупреждения при использовании first-style написании кода (см laxcomma). Пример:
    var foo = «blah blah»
    + «blah blah»;
  • laxcomma
    Этот параметр подавляет сообщения об ошибке при first-style написании кода. Пример
    :
    var obj = {
    name: ‘Anton’
    , handle: ‘valueof’
    , role: ‘SW Engineer’
    };
  • loopfunc
    Этот параметр подавляет сообщения об ошибке при объявлении функций внутри циклов. Такие объявления могут приводить в подобным ошибкам:
    var nums = [];for (var i = 0; i < 10; i++) {
    nums[i] = function (j) {
    return i + j;
    };
    }nums[0](2); // выводиться 12 вместо 2
Исправить ошибку можно копируя i при объявлении функции:
var nums = [];
for (var i = 0; i < 10; i++) {
(function (i) {
nums[i] = function (j) {
return i + j;
}
}(i));
}
  • multistr
    Этот параметр подавляет сообщения об ошибке при при использовании «многострочных» строк текста. Многострочный текст может быть опасными в случае, если после экранирующего символа в конце строки (\) попадёт пробел.
    Хотя этот параметр перестаёт выводить предупреждения при использовании многострочного текста, при возникновении ошибки (пробел после экранирующего символа, либо отсутствие его совсем), сообщение будет выведено.
    Пример:
    /*jshint multistr:true */var text = «Hello\
    World»; // Все отлично.text = «Hello
    World»; // Предупреждение — нет экранирующего символа.
text = «Hello\
World»; // Предупреждение — пробел после экранирующего символа (подсветить нечем, но он там есть :))
  • onecase
    Этот параметр подавляет сообщения об ошибке при использовании единственного варианта выбора в конструкции switch. Обычно, в таких случаях можно обойтись обычным условием, однако такая ситуация часто возникает при автоматической генерации кода.
  • proto
    Этот параметр подавляет сообщения об ошибке при использовании свойства __proto__. Это свойство объявлено устаревшим и больше не поддерживается браузерами.
  • regexdash
    Этот параметр подавляет сообщения об ошибке, если используется не экранированный в конце регулярного выражения.
  • scripturl
    Этот параметр подавляет сообщения об ошибке при использовании строки URL со скриптом, какой как javascript:….
  • smarttabs
    Этот параметр подавляет сообщения об ошибке при использовании для отделения блоков кода пробелов и табуляторов вперемешку. Такая техника называется
    SmartTabs.
  • shadow
    Этот параметр подавляет сообщения об ошибке при объявлении переменной, которая уже была объявлена во внешней области видимости.
  • sub
    Этот параметр подавляет сообщения об ошибке при использовании нотации [] при обращению к свойствам объекта, когда это свойство возможно получить с использованием точечной нотации. Те person['name'] или person.name.
  • supernew
    Этот параметр подавляет сообщения об ошибке при использовании странных конструкций, типа new function () { … } и new Object;. Однако такие конструкции иногда используются при создании объектов «одиночек», к примеру:
    var singleton = new function() {
    var privateVar;this.publicMethod = function () {}
    this.publicMethod2 = function () {}
    };
  • validthis
    Этот параметр подавляет сообщения об ошибке при возможных нарушениях строгого режима. Использование этого параметра возможно в области видимости функции, которая работает в строгом режиме.
    Примечание: параметр нужно использовать только внутри функции. При попытке использовать его глобально, JSHint завершится с ошибкой.
Параметры среды исполнения.
Эти параметры позволяют предварительно определить глобальные переменные используемых библиотек, браузера или node.js. По сути они являются аналогами объявлений вида /*global $:false, jQuery:false */.
  • browser
    Этот параметр объявляет глобальные объекты современных браузеров, такие как document и navigator, а также объекты HTML5 типа
    FileReader и другие.
    Примечание: параметр не объявляет переменные типа alert или console. Для этого используется параметр devel.
  • couch
    Этот параметр объявляет глобальные объекты CouchDB.
    CouchDB — это документоориентированная база данных, данные из которой могут быть запрошены с использованием MapReduce, используя JavaScript.
  • devel
    Этот параметр объявляет глобальные объекты, которые обычно используются для отладки (console, alert). Как правило, они не должны присутствовать в готовом коде.
  • dojo
    Этот параметр объявляет глобальные объекты для
    Dojo Toolkit.
  • jquery
    Этот параметр объявляет глобальные объекты для
    jQuery — библиотеки
    JavaScript.
  • mootools
    Этот параметр объявляет глобальные объекты для
    MooTools — JavaScript фреймворка.
  • node
    Этот параметр объявляет глобальные объекты для кода, исполняемого внутри node.js.
    Node.js — это серверная имплементация языка JavaScript, которая использует асинхронную событийную модель.
  • nonstandard
    Этот параметр определяет не стандартные, но часто используемые глобальные объекты, такие как escape и unescape.
  • prototypejs
    Этот параметр объявляет глобальные объекты для
    Prototype — JavaScript фреймворка.
  • rhino
    Этот параметр объявляет глобальные объекты для кода, исполняемого внутри Rhino.
    Rhino — это реализация JavaScript, написанная на Java с открытым исходным кодом.
  • wsh
    Этот параметр объявляет глобальные объекты, используемые в коде, написанном для
    Windows Script Host.
Параметры, оставшиеся по историческим причинам.
Эти параметры остались от JSLint. Эти параметры не будут дорабатываться, и в далнейшем могут быть удалены.
  • nomen
    Этот параметр запрещает использовать _ в именах переменных. Мы не знаем, нафига это нужно.
  • onevar
    Этот параметр позволяет использовать только один var в теле функции. Некоторые уверены, что использование одного var в коде улучшает его наглядность. Пример
    (код для JSHint/JSLint):
    x.nud = function () {
    var b, f, i, j, p, seen = {}, t;b = token.line !== nexttoken.line;
    if (b) {
    indent += option.indent;
    if (nexttoken.from === indent + option.indent) {
    indent += option.indent;
    }
    }// [...]
    };
  • passfail
    Этот параметр останавливает проверку дальнейшего кода, при появлении первой ошибки или предупреждения.
  • white
    Этот параметр позволяет делать проверку кода на соответствие стилю, который предлагает Douglas Crockford’s. Но, к сожалению, в его книге «The Good Parts» это плохо документировано.
https://github.com/jshint/jshint/blob/master/src/stable/jshint.js
{
// JSHint Default Configuration File (as on JSHint website)
// See http://jshint.com/docs/ for more details
 
"maxerr"        : 50,       // {int} Maximum error before stopping
 
// Enforcing
"bitwise"       : true,     // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase"     : false,    // true: Identifiers must be in camelCase
"curly"         : true,     // true: Require {} for every new block or scope
"eqeqeq"        : true,     // true: Require triple equals (===) for comparison
"forin"         : true,     // true: Require filtering for..in loops with 
                                     obj.hasOwnProperty()
"immed"         : false,    // true: Require immediate invocations to be wrapped in 
                                     parens e.g. `(function () { } ());`
"indent"        : 4,        // {int} Number of spaces to use for indentation
"latedef"       : false,    // true: Require variables/functions to be defined before 
                                     being used
"newcap"        : false,    // true: Require capitalization of all constructor functions 
                                     e.g. `new F()`
"noarg"         : true,     // true: Prohibit use of `arguments.caller` and 
                                     `arguments.callee`
"noempty"       : true,     // true: Prohibit use of empty blocks
"nonew"         : false,    // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus"      : false,    // true: Prohibit use of `++` & `--`
"quotmark"      : false,    // Quotation mark consistency:
                            //   false    : do nothing (default)
                            //   true     : ensure whatever is used is consistent
                            //   "single" : require single quotes
                            //   "double" : require double quotes
"undef"         : true,     // true: Require all non-global variables to be declared 
                                     (prevents global leaks)
"unused"        : true,     // true: Require all defined variables be used
"strict"        : true,     // true: Requires all functions run in ES5 Strict Mode
"trailing"      : false,    // true: Prohibit trailing whitespaces
"maxparams"     : false,    // {int} Max number of formal params allowed per function
"maxdepth"      : false,    // {int} Max depth of nested blocks (within functions)
"maxstatements" : false,    // {int} Max number statements per function
"maxcomplexity" : false,    // {int} Max cyclomatic complexity per function
"maxlen"        : false,    // {int} Max number of characters per line
 
// Relaxing
"asi"           : false,     // true: Tolerate Automatic Semicolon Insertion (no 
                                      semicolons)
"boss"          : false,     // true: Tolerate assignments where comparisons would be 
                                      expected
"debug"         : false,     // true: Allow debugger statements e.g. browser breakpoints.
"eqnull"        : false,     // true: Tolerate use of `== null`
"es5"           : false,     // true: Allow ES5 syntax (ex: getters and setters)
"esnext"        : false,     // true: Allow ES.next (ES6) syntax (ex: `const`)
"moz"           : false,     // true: Allow Mozilla specific syntax (extends and 
                                      overrides esnext features)
                             // (ex: `for each`, multiple try/catch, function 
                                      expression…)
"evil"          : false,     // true: Tolerate use of `eval` and `new Function()`
"expr"          : false,     // true: Tolerate `ExpressionStatement` as Programs
"funcscope"     : false,     // true: Tolerate defining variables inside control 
                                      statements"
"globalstrict"  : false,     // true: Allow global "use strict" (also enables 'strict')
"iterator"      : false,     // true: Tolerate using the `__iterator__` property
"lastsemic"     : false,     // true: Tolerate omitting a semicolon for the last 
                                      statement of a 1-line block
"laxbreak"      : false,     // true: Tolerate possibly unsafe line breakings
"laxcomma"      : false,     // true: Tolerate comma-first style coding
"loopfunc"      : false,     // true: Tolerate functions being defined in loops
"multistr"      : false,     // true: Tolerate multi-line strings
"proto"         : false,     // true: Tolerate using the `__proto__` property
"scripturl"     : false,     // true: Tolerate script-targeted URLs
"smarttabs"     : false,     // true: Tolerate mixed tabs/spaces when used for alignment
"shadow"        : false,     // true: Allows re-define variables later in code e.g. `var 
                                      x=1; x=2;`
"sub"           : false,     // true: Tolerate using `[]` notation when it can still be 
                                      expressed in dot notation
"supernew"      : false,     // true: Tolerate `new function () { ... };` and `new 
                                      Object;`
"validthis"     : false,     // true: Tolerate using this in a non-constructor function
 
// Environments
"browser"       : true,     // Web Browser (window, document, etc)
"couch"         : false,    // CouchDB
"devel"         : true,     // Development/debugging (alert, confirm, etc)
"dojo"          : false,    // Dojo Toolkit
"jquery"        : false,    // jQuery
"mootools"      : false,    // MooTools
"node"          : false,    // Node.js
"nonstandard"   : false,    // Widely adopted globals (escape, unescape, etc)
"prototypejs"   : false,    // Prototype and Scriptaculous
"rhino"         : false,    // Rhino
"worker"        : false,    // Web Workers
"wsh"           : false,    // Windows Scripting Host
"yui"           : false,    // Yahoo User Interface
 
// Legacy
"nomen"         : false,    // true: Prohibit dangling `_` in variables
"onevar"        : false,    // true: Allow only one `var` statement per function
"passfail"      : false,    // true: Stop on first error
"white"         : false,    // true: Check against strict whitespace and indentation 
                                     rules
 
// Custom Globals
"predef"        : [ ]       // additional predefined global variables
}