Ответ 1
Вы пишете функцию, которая возвращает замыкание.
function mod(a) {
return function(b) {
return b % a;
}
}
alert(mod(3)(9));
Я был в интервью, и я получил все вопросы, за исключением этого.
Первый вопрос, связанный с этим, заключался в том, как вы пишете функцию для mod(3,9)
, чтобы она возвращала 0.
Хорошо, просто:
function mod(a,b){
return b%a;
}
После этого вы записали функцию mod(3)(9)
так, чтобы она вернула 0?
Я был в тупике...
Вы пишете функцию, которая возвращает замыкание.
function mod(a) {
return function(b) {
return b % a;
}
}
alert(mod(3)(9));
Прежде всего, внимательно посмотрите на использование этой конструкции:
mod(3)(9);
Вы можете разбить его на два этапа:
var fn = mod(3);
fn(9);
Отсюда очевидно, что только mod(3)
должен возвращать новую функцию, чтобы впоследствии ее можно было вызвать снова. Эта новая функция должна сохранять значение, переданное с первым вызовом. Это ключевая часть: вы должны сохранить это значение в закрытии (хорошо оно сохраняется автоматически из-за природы закрытия):
function mod(x) {
return function(y) {
return y % x;
};
}
Вот хорошая иллюстрация термина "закрытие". Если кто-то спрашивает вас (например, на собеседовании), вы можете сказать: закрытие - это функция с областью, из которой она была первоначально создана. Таким образом, в вышеприведенной функции новая внутренняя функция всегда имеет внутренний доступ к параметру внешней функции x
.
Вы можете использовать функцию, которая возвращает другую функцию
function mod(a) {
return function(b) {
return b % a;
}
}