while (numberString.length < 3)
numberString = "0" + numberString;
console.log(numberString + " " + label);
}
// вывестиИнвентаризациюФермы
function printFarmInventory(cows, chickens, pigs) {
printZeroPaddedWithLabel(cows, "Коров");
printZeroPaddedWithLabel(chickens, "Куриц");
printZeroPaddedWithLabel(pigs, "Свиней");
}
printFarmInventory(7, 11, 3);
Работает! Но название printZeroPaddedWithLabel
// добавитьНулей
function zeroPad(number, width) {
var string = String(number);
while (string.length < width)
string = "0" + string;
return string;
}
// вывестиИнвентаризациюФермы
function printFarmInventory(cows, chickens, pigs) {
console.log(zeroPad(cows, 3) + " Коров");
console.log(zeroPad(chickens, 3) + " Куриц");
console.log(zeroPad(pigs, 3) + " Свиней");
}
printFarmInventory(7, 16, 3);
Функция с хорошим, понятным именем zeroPad
Насколько умными и универсальными должны быть функции? Мы можем написать как простейшую функцию, которая дополняет число нулями до трёх позиций, так и навороченную функцию общего назначения для форматирования номеров, поддерживающую дроби, отрицательные числа, выравнивание по точкам, дополнение разными символами, и т. п.
Хорошее правило – добавляйте только ту функциональность, которая вам точно пригодится. Иногда появляется искушение создавать фреймворки общего назначения для каждой небольшой потребности. Сопротивляйтесь ему. Вы никогда не закончите работу, а просто напишете кучу кода, который никто не будет использовать.
Функции и побочные эффекты
Функции можно грубо разделить на те, что вызываются из-за своих побочных эффектов, и те, что вызываются для получения некоторого значения. Конечно, возможно и объединение этих свойств в одной функции.
Первая вспомогательная функция в примере с фермой, printZeroPaddedWithLabel
zeroPad, из-за возвращаемого значения. И это не совпадение, что вторая функция пригождается чаще первой. Функции, возвращающие значения, легче комбинировать друг с другом, чем функции, создающие побочные эффекты.Чистая функция – особый вид функции, возвращающей значения, которая не только не имеет побочных эффектов, но и не зависит от побочных эффектов остального кода – к примеру, не работает с глобальными переменными, которые могут быть случайно изменены где-то ещё. Чистая функция, будучи вызванной с одними и теми же аргументами, возвращает один и тот же результат (и больше ничего не делает) – что довольно приятно. С ней просто работать. Вызов такой функции можно мысленно заменять результатом её работы, без изменения смысла кода. Когда вы хотите проверить такую функцию, вы можете просто вызвать её, и быть уверенным, что если она работает в данном контексте, она будет работать в любом. Не такие чистые функции могут возвращать разные результаты в зависимости от многих факторов, и иметь побочные эффекты, которые сложно проверять и учитывать.
Однако, не надо стесняться писать не совсем чистые функции, или начинать священную чистку кода от таких функций. Побочные эффекты часто полезны. Нет способа написать чистую версию функции console.log
Итог
Эта глава показала вам, как писать собственные функции. Когда ключевое слово function
// Создаём f со ссылкой на функцию
var f = function(a) {
console.log(a + 2);
};
// Объявляем функцию g
function g(a, b) {
return a * b * 3.5;
}