Организация файлов
- Все файлы javascript должны размещаться в общей папке проекта '''script'''
- Используемые файлы сторонних библиотек должны размещаться в папке '''script/lib'''
- Переиспользуемые пользовательские модули должны размещаться в папке '''script/commons'''. Если переиспользуемый модуль включает несколько подфайлов, необходимо создать отдельную папку модуля
- Файлы Javascript, используемые отдельными модулями страниц, должны размещаться в папке '''script/{module_name}'''
- Данные JSON, имитируемые проектом, должны размещаться в папке '''script/json''', при этом для каждой страницы создаются отдельные подпапки
- При использовании MVC-фреймворка в JavaScript используемые файлы шаблонов должны размещаться в папке '''script/templates''', при этом для каждой страницы создаются отдельные подпапки
Форматирование
- Общие принципы см. в [PhpGuideline PHP Coding Standards]
- Всегда используйте var для определения переменных
var global = '';
function method() {
var local = '';
}
- Всегда завершайте инструкцию объявления точкой с запятой
- Не используйте лишнюю "," для массивов и объектов (для совместимости с IE)
//wrong
var arr = [1,2,];
var person = {
name: 'name',
age: 20,
};
//wrong
var arr = [1,2];
var person = {
name: 'name',
age: 20
};
- Определите пространство имен верхнего уровня, например inBike, и определите пользовательские приватные пространства имен внутри пространства имен верхнего уровня, разделенные по модулям
- Весь код модуля должен быть помещен в анонимные самовызывающиеся функции, экспонируемые путем присваивания значений пользовательским пространствам имен под объектом window
if (!window.inBike) {
window.inBike = {};
}
window.inBike.rideway = rideway;
- Код привязки событий должен выполняться в функции готовности DOM
$(function() {
//bind function is in the init function
window.inBike.rideway.init();
})
- Поместите пользовательские методы модуля в объект. Сразу после имени метода должно следовать ":". Оставьте один пробел между ":" и "function". Оставьте один пробел между "function()" и следующей "{"
var module = function() {
method: function() {
}
};
- Используйте одинарные кавычки для обрамления строк
var str = 'some text';
- Все используемые переменные должны быть определены до использования и инициализированы сразу после определения
var obj = null;
var num = 0;
var arr = [];
var isEmpty = true;
- Проверьте, поддерживается ли он, перед использованием инструмента консоли браузера
if (console) {
console.log('this is my log');
}
Чтобы задать имя ограничения UNIQUE и применить его к нескольким столбцам, можно использовать следующий синтаксис:
- Общие принципы см. в [PhpGuideline PHP Coding Standards]
- Используйте camelCase для именования переменных и методов, при этом первая буква строчная. В именах классов первая буква должна быть заглавной
var numberList = [1,2];
var util = {
removeNode: function(){
....
}
};
function Person(name, age) {
this.name = name;
this.age = age;
}
- Используйте $name для именования объектов jQuery. Имена нативных DOM-элементов начинаются с "dom". Приватные переменные в объекте начинаются с подчеркивания
var $image = $('#cover');
var domImage = document.getElementById('cover');
var obj = {
_privateVar: null,
method: function() {
}
};
Комментарии
- Общие принципы см. в [PhpGuideline PHP Coding Standards]
- Используйте больше однострочных комментариев, чтобы обозначить смысл логических блоков
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
- Отмечайте метод-конструктор класса
/**
* @constructor
*/
some.long.namespace.MyClass = function() {
};
- Аннотируйте тип и назначение констант перечисления
/** @enum {string} */
some.long.namespace.Fruit = {
APPLE: 'a',
BANANA: 'b'
};
- Используйте комментарии, чтобы отметить видимость методов или переменных — это упрощает статическую проверку
/** @protected */
AA_PublicClass.staticProtectedProp = 31;
/** @private */
AA_PublicClass.prototype.privateMethod_ = function() {};
Лучшие практики
- Избегайте использования eval
- Избегайте использования with для объектов и for-in для массивов
- Используйте замыкания осторожно, чтобы избежать циклических ссылок
- Будьте внимательны к контексту, в котором используется this
var $button = $('#my-button');
$button.click(function(){
var self = this;
var util = {
getVal: function() {
return self.val();
}
}
});
- По возможности используйте сокращённые формы записи, такие как тернарный оператор, логическое переключение, операции инкремента и т. д.
var name = ('undefined' == typeof(name)) ? '' : name;
(age < 0) && (age = 0);
count++;
- Не используйте function в блочной области видимости
// 错误
if (x) {
function foo() {}
}
// 正确
if (x) {
var foo = function() {}
}
- Привязывайте обработчики событий к родительскому узлу и обрабатывайте их отдельно в зависимости от источника события
- Для сложных модулей страницы используйте библиотеки управления зависимостями, такие как SeaJS, RequireJS, и MVC-фреймворки, такие как Backbone, Knockout, Stapes, чтобы организовать свой код