На многих языках вы можете передать ссылку на функцию в качестве аргумента функции. Это позволяет хост-функции использовать этот аргумент и вызывать эту функцию, когда это необходимо. Это все, что происходит в Javascript. Когда вы передаете имя функции без ()
после нее, вы просто передаете ссылку на функцию. Это позволяет функции хоста использовать эту функцию в качестве аргумента и вызывать ее через некоторое время.
В вашем конкретном примере .map()
ожидает, что вы передадите функцию, которая будет вызывать один раз для каждого элемента массива. Таким образом, вы передаете имя функции, которая затем будет вызываться несколько раз, один раз для каждого элемента массива. Эта функция, которую вы передаете, имеет немного контракта, который он должен выполнить. Он будет передан три аргумента (value, index, array)
и он должен вернуть значение, которое будет использоваться для построения нового массива.
В Javascript, поскольку тип проверки аргументов не существует, ответственность разработчика заключается в том, чтобы убедиться, что аргументы функции, которую вы проходите, соответствуют тому, что вызывающий объект этой функции действительно перейдет к ней, и вы должны обратитесь к документации самого вызывающего кода, чтобы узнать, какие аргументы будут переданы ему. Вы можете назвать аргументы чем угодно (что полностью внутренне для вашей реализации функции), но порядок и количество аргументов определяется вызывающим, и вы должны объявить свою функцию в соответствии с тем, что предоставит вызывающий.
Однажды вещь, которая смутила многих в Javascript.
Если вы передаете только имя функции, вы передаете ссылку на функцию (то, что функция хоста может вызвать позднее).
array.map(myFn) // passes a function reference
Или используйте встроенную функцию (тот же результат):
array.map(function(value, index, arr) {
// code goes here
})
Если поставить скобки в конце имени функции, то функция выполняется немедленно и возвращаемое значение этой функции исполнение то, что передается:
array.push(myFn()); // pushes the result of calling myFn()
Функции - объекты в javascript. –
Я думаю, что лучший вопрос - почему нет? Вы не упомянули о какой-либо подозрительной теоретической проблеме, почему это не должно работать, так почему бы не разрешить это на языке? – ASDFGerte
Это просто ссылка, она будет такой же, как 'arr.map (function() {})', где обратный вызов вызывается для каждого значения в массиве – adeneo