Переменная knownArgs
хранит копию значения arguments
в том виде, в каком оно было при вызове partial()
. Этот вызов возвращает другую функцию, и внутри этого кода arguments
— это совершенно другой список, это аргументы, переданные этой возвращаемой функции. Другими словами:
var p = partial(someFunction, "привет", "мир");
Когда вызывается p()
, knownArgs
будет "hello" и "world" (ну и someFunction
тоже, но учтите, что первый цикл начинается с 1). Если вызов p()
выглядит так:
p("как", "есть", "ты");
затем он сначала поместит «hello» и «world» в список realArgs
(из knownArgs
), а затем три параметра, переданные в p()
, из arguments
.
изменить пошаговое описание того, как оценивается map(partial(op["+"], 1), [0, 2, 4, 6, 8, 10]);
:
Во-первых, необходимо оценить op["+"]
. Я предполагаю, что он возвращает функцию, возможно, что-то вроде этого:
function add(a, b) {
return a + b;
}
Эта функция «добавить» и значение 1
передаются в partial()
. Таким образом, внутри partial()
псевдомассив arguments
выглядит так:
[ add, 1 ]
То есть первый параметр — это функция «добавить» из op["+"]
, а второй — это значение 1
. Единственное, что действительно делает partial()
перед возвратом анонимной функции, — это сохраняет arguments
в knownArgs
. Это необходимо сделать, потому что странной псевдопеременной arguments
всегда присваивается новое значение при каждом вызове функции. Он сохраняется здесь, чтобы код анонимной функции мог получить к нему доступ позже.
Теперь, когда анонимная функция возвращается из partial()
и этот массив четных чисел, мы вызываем map()
. Эта функция, вероятно, выглядит примерно так (у меня нет книги):
function map(fn, list) {
var i, result = [];
for (i = 0; i < list.length; ++i) {
result.push( fn( list[i] ) );
}
return result;
}
Таким образом, внутри map()
первым параметром является анонимная функция, возвращенная из более раннего вызова partial()
. Что делает эта функция? Что ж, он объединяет параметры исходного вызова partial()
, кроме первого, с переданными ему параметрами. Функция map()
передает только один параметр, поэтому результирующий список параметров при каждом вызове анонимной функции будет представлять собой значение, 1
переданное partial()
, а затем, на каждой итерации, другое четное число из списка.
Более простым примером может быть рассмотрение того, что происходит, когда вы вызываете:
partial(op["+"], 1)(2);
То есть, если вы вызываете partial()
, а затем сразу же используете его возвращаемое значение (анонимная функция). Эффект будет таким же, как и при вызове:
add(1, 2);
person
Pointy
schedule
11.11.2012