function work(a, b) {
alert( a + b );
}
// Создается функция, которая принимает в себя другую функцию
function spy(func) {
// Создается обёртка, которая принимает в себя переданные аргументы (a, b)
function wrapper(...args) {
// В метод calls функции wrapper, который массив, сохраняются переданные
// аргументы wrapper.calls.push(args);
// И здесь вызывается переданная функция, с переданными аргументами.
// По поводу того, на что указывает this, есть простая памятка:
// this вызывается на метод перед точкой.
return func.apply(this, arguments);
}
// Сюда сохраняются агрументы
wrapper.calls = [];
// В итоге функция Spy возвращает функцию wrapper
return wrapper;
}
// Здесь функция work превращается в spy(work). Как мы помним, функция
// spy возвращает функцию wrapper. То есть что происходит:
// вызывается функция spy(work), work передается внутрь wrapper.
// work теперь wrapper, со всеми методами. Это можно проверить в браузере.
// Введите console.log(work) после этой строчки, и рассмотрите его поближе.
work = spy(work);
// Теперь смотря на эту функцию, смотрите на wrapper, ибо work = wrapper.
// Что происходит:
// в функцию wrapper передаются аргументы (1, 2), они сохраняются внутрь
// wrapper.calls, и вызывается изначальная функция work что выполняет сложение.
// Но мы помним что work = wrapper, так что теперь у work есть метод work.calls.
work(1, 2); // 3
work(4, 5); // 9
// Вот тут она и вызывается. Как видите, не wrapper.calls, a work.calls.
for (let args of work.calls) {
alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
function addLetters(...letters) {
// Объявляем полный алфавит, 26 букв:
const alphabet = 'abcdefghijklmnopqrstuvwxyz';
// Изначально объявим sum = 25 чтобы в случае пустого значения получать z:
let sum = 25;
// Находим "индекс" переданных букв:
for (let letter of letters) {
sum += alphabet.indexOf(letter) + 1;
}
// И возвращаем только ту букву, что в итоге делиться на 26,
// то есть на общее количество букв в алфавите:
return alphabet[sum % 26];
}
console.log(addLetters('a', 'b', 'c')) // f