Forked from agragregra/WordPress Get Category name By label
Last active
October 18, 2016 04:44
-
-
Save tsvetkovpro/4bead3af3d0ad8b52204 to your computer and use it in GitHub Desktop.
js: refactoring
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Здесь вы определяете ГЛОБАЛЬНУЮ переменную, засоряя при этом глобальное пространство имен. | |
// В будущем это может привести к очень неочевидным проблемам при отладке. | |
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