Подтвердить что ты не робот

Как написать функцию для mod (3) (9)?

Я был в интервью, и я получил все вопросы, за исключением этого.

Первый вопрос, связанный с этим, заключался в том, как вы пишете функцию для mod(3,9), чтобы она возвращала 0.

Хорошо, просто:

function mod(a,b){
    return b%a;
}

После этого вы записали функцию mod(3)(9) так, чтобы она вернула 0?

Я был в тупике...

4b9b3361

Ответ 1

Вы пишете функцию, которая возвращает замыкание.

function mod(a) {
  return function(b) {
    return b % a;
  }
}

alert(mod(3)(9));

Ответ 2

Прежде всего, внимательно посмотрите на использование этой конструкции:

mod(3)(9);

Вы можете разбить его на два этапа:

var fn = mod(3);
fn(9);

Отсюда очевидно, что только mod(3) должен возвращать новую функцию, чтобы впоследствии ее можно было вызвать снова. Эта новая функция должна сохранять значение, переданное с первым вызовом. Это ключевая часть: вы должны сохранить это значение в закрытии (хорошо оно сохраняется автоматически из-за природы закрытия):

function mod(x) {
    return function(y) {
        return y % x;
    };
}

Вот хорошая иллюстрация термина "закрытие". Если кто-то спрашивает вас (например, на собеседовании), вы можете сказать: закрытие - это функция с областью, из которой она была первоначально создана. Таким образом, в вышеприведенной функции новая внутренняя функция всегда имеет внутренний доступ к параметру внешней функции x.

Ответ 3

Вы можете использовать функцию, которая возвращает другую функцию

function mod(a) {
    return function(b) {
        return b % a;
    }
}