Для тестирования JavaScript рекомендуется использовать Chai вместе Mocha на Node.js.
devDependencies: {
"chai": "*",
"mocha": "*" // our preference, but you can use any test runner you like
}
четверг, 25 апреля 2013 г.
среда, 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;
}
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 = [];
var nums = [];
for (var i = 0; i < 10;
i++) {
(function (i) {
nums[i] = function (j) {
return i + j;
}
}(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»; // Предупреждение — пробел после экранирующего символа (подсветить нечем, но он там есть )
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
}
Подписаться на:
Сообщения (Atom)