Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
ready: function(cb) {
var _t = this, i = setInterval(function() {
if (_t._r) {
cb();
clearInterval(i);
}
}, 10);
},
Super-simple gettext translation in pure JSи, хочу я сказать, что Gettext тут не при чем.
// Неправильное определение переменной: нет ключевого
// слова "var" - несоблюдение строгих стандартов JS.
pojs = {
// Непонятное имя свойства
_l: null,
// Непонятное имя свойства
_r: false,
// Непонятное имя свойства
_p: {},
// Непонятное имя параметра
init: function(l) {
this._l = l;
this._load();
},
_: function(key, args) {
// Избыточное выражение.
// Проще:
// this._p[key] || key
//
// Неправильное форматирование кода. Не только здесь, повсеместно.
// Рекомендую к прочтению JS Style Guide: https://github.com/BR0kEN-/javascript
//
// В данном случае лучше так:
// var t = this._p[key] || key,
// a;
var t = this._p.hasOwnProperty(key) ? this._p[key] : key, a;
// Неправильная проверка. "args" может быть строкой и удовлетворять условие.
// Пример:
// var args = 'string';
//
// if (args) {
// for (var arg in args) {
// // args[arg] = s
// // args[arg] = t
// // args[arg] = r
// // args[arg] = i
// // args[arg] = n
// // args[arg] = g
// }
// }
if (args) {
for (a in args) {
t = t.replace(/%s/, args[a]);
}
}
return t;
},
// Неправильный подход. Необходимо использовать
// событие "load" для XMLHttp объекта.
//
// Отсутствие проверки на тип.
// Пример:
// pojs.ready('fucking code');
// Uncaught TypeError: string is not a function
ready: function(cb) {
var _t = this, i = setInterval(function() {
if (_t._r) {
cb();
clearInterval(i);
}
}, 10);
},
_load: function() {
// "'localStorage' in window" и "window['localStorage'] !== null" - одно и то же.
var _t = this, x, lsa = 'localStorage' in window && window['localStorage'] !== null, cache = null;
if (_t._l) {
if (lsa) {
cache = localStorage.getItem('pojs_' + _t._l);
if (cache) {
_t._p = JSON.parse(cache);
_t._r = true;
return;
}
}
x = new XMLHttpRequest();
x.onreadystatechange = function() {
// Избыточная вложенность и неправильное обращение к объекту.
//
// Выражение записывается так:
// if (this.readyState === 4 && this.status === 200) {
// // actions
// }
//
// Или же еще проще:
// if (this.response) {
// // actions
// }
//
// Помимо этого, в IE8, данный код обрастет ошибками:
// - отсутствие объекта XMLHttpRequest;
// - отсутствие объекта console.
if (x.readyState === 4) {
if (x.status === 200) {
// Выше, почему-то, есть проверка на существование
// localStorage, а тут подразумевается что объект
// будет во что бы то ни стало?
localStorage.setItem('pojs_' + _t._l, x.responseText);
_t._p = JSON.parse(x.responseText);
} else {
console.error('Can not load JSON from ' + _t._l);
}
_t._r = true;
}
};
x.open('GET', this._l, true);
x.send();
} else {
_t._r = true;
}
}
};
po.js — супер простая утилита для i18n