JavaScript: Вызов функции — выражение
Когда мы пишем программы, нам нужно соединять действия друг с другом. Сложение чисел, объединение строк и работа с переменными — примеры того, как простые шаги комбинируются в более сложное поведение.
const rate = 10;
const hours = 5;
const salary = rate * hours + 100;
console.log(salary); // => 150В программировании для этого используют понятие выражение — конструкцию, которая вычисляется и даёт результат. В примере выше rate * hours + 100 является выражением, составленным из переменных, числового литерала и арифметических операций. Результат можно сохранить в переменную или использовать дальше.
Выражения можно комбинировать бесконечно, постепенно усложняя логику. Каждое новое выражение становится частью большего:
const bonus = 50;
const salary = (rate * hours + bonus) * 12 - 500;
console.log(salary);Именно так и строятся программы: маленькие шаги складываются в большие конструкции. Поэтому заранее заучить все комбинации невозможно — гораздо важнее понять, как выражения соединяются между собой.
Выражения как аргументы функций
Аргументом функции всегда является какое-то значение. Но значение можно не только записывать напрямую, но и вычислять. А значит, в аргументы функции можно подставлять любые выражения:
// Здесь аргумент — число 150
console.log(150);
// А здесь аргумент — выражение, которое сначала вычисляется
console.log(10 * 15); // => 150
// Можно комбинировать сложнее
const rate = 10;
const hours = 15;
const bonus = 50;
console.log(rate * hours + bonus); // => 200Функция console.log() просто получает готовое значение и выводит его. Способ получения этого значения функции безразличен — поэтому вызовы функций отлично сочетаются с любыми выражениями.
Вызов функции внутри функции
Так как вызов функции сам по себе является выражением, его результат можно сразу передавать другой функции:
// Math.abs(-5) возвращает 5
// Этот результат сразу используется как аргумент console.log()
console.log(Math.abs(-5)); // => 5Здесь Math.abs(-5) вычисляется первым и возвращает 5. Затем это значение подставляется в вызов console.log(). Такая комбинация может быть сколько угодно глубокой:
console.log(Math.abs(-5))
Шаг 1: Math.abs(-5) → 5
Шаг 2: console.log(5) → выводит 5Сначала вычисляются вложенные вызовы, потом внешний. Например, в Math.round(Math.random() * 10) сначала отработает Math.random(), затем умножение, и только потом Math.round().
Использование функций в составе выражений
Функции возвращают значения, а значит их вызовы можно использовать как часть любых других выражений. Для длины строки воспользуемся функцией length():
import { length } from 'hexlet-basics/string';
const name = 'python';
// Длина строки минус 1 — индекс последнего символа
const lastIndex = length(name) - 1;
console.log(lastIndex); // => 5
// Результат можно использовать в арифметике
const text = 'hexlet';
const double = length(text) * 2;
console.log(double); // => 12Здесь length(name) и length(text) являются полноценными выражениями: они возвращают значения, которые можно комбинировать с числами, переменными и другими операциями.
Задание
Дана строка text = 'Hexlet'. Выведите первый и последний символы в формате:
First: H
Last: tВаше упражнение проверяется по этим тестам
// @ts-check
import { expect, test, vi } from 'vitest';
test('calling functions expression', async () => {
const consoleLogSpy = vi.spyOn(console, 'log');
await import('./index.js');
const firstArg = consoleLogSpy.mock.calls.join('\n');
expect(firstArg).toBe('First: H\nLast: t');
});Решение учителя откроется через:
20:00
