Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tsvetkovpro/4bead3af3d0ad8b52204 to your computer and use it in GitHub Desktop.
Save tsvetkovpro/4bead3af3d0ad8b52204 to your computer and use it in GitHub Desktop.
js: refactoring
// Здесь вы определяете ГЛОБАЛЬНУЮ переменную, засоряя при этом глобальное пространство имен.
// В будущем это может привести к очень неочевидным проблемам при отладке.
var out = 0;
function squareSum(numbers){
// Стоит отметить, что условие перехода к следующей итерации
// цикла выполняется для КАЖДОГО его элемента. Это значит,
// что имея массив из 10 тысяч элементов вы 10 тысяч раз выполните
// numbers.length. Согласитесь, это не очень то эффективно (особенно
// если учесть, что длина массива не меняется).
for (var i = 0; i < numbers.length; i++) {
// Переменная res - не нужна. Кроме того, получение элемента массива
// занимает некоторое время, поэтому на больших массивах выполнять
// эту операцию дважды - не лучшая идея.
var res = numbers[i] * numbers[i];
// Используя переменную из глобального контекста вы сломаете
// любой другой код, который от нее зависит. Да, сейчас вы об
// этом помните, но где гарантии, что вы (или ваш последователь)
// не станет использовать эту же переменную где-то еще?
out += res;
// Эта конструкция тоже разрушает "чистоту" функции.
// Представьте, что вам нужно будет выкинуть все console.log
// из кода. Что будете делать?
console.log(out);
}
}
// Ок, но функция, результат которой не используется - не нужна.
squareSum([1, 2, 2]);
(1)
function squareSum(numbers, logger) {
var res = 0,
// Если последний аргумент опущен, то заменяем реальную
// функцию-логгер на заглушку, которая не будет делать ничего.
log = (typeof logger === 'function') ? logger : function() {};
for (var i = 0, len = numbers.length; i < len; i++) {
res += Math.pow(numbers[i], 2);
log(res);
}
return res;
}
var sum = squareSum([1, 2, 2], console.log);
(2)
/*
В данном примере, проходим по массиву с помощью метода forEach(), каждый элемент массива item возводится в квадрат с помощью метода Math.pow(число, степень).
Метод forEach() выполняет указанную функцию один раз для каждого элемента в массиве.
MDN Array.prototype.forEach()
Метод Math.pow() возвращает основание, возведённое в степень показатель.
MDN Math.pow()
*/
function squareSum(numbers){
var result = 0;
numbers.forEach(function(item) {
result += Math.pow(item, 2);
});
return result;
}
console.log( squareSum([1, 2, 2]) );
(3) best practies
function squareSum(numbers){
return numbers.reduce(function(sum, n){
return (n*n) + sum;
}, 0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment