2016-10-15 3 views
2

Может кто-нибудь объяснить, почему мы можем просто передать имя метода функции более высокого порядка, и все работает отлично. Я знаю что-то вроде Java, я должен вызвать метод words для каждого элемента отдельно. Мне сказали, что в Javascript, если совпадают подписи метода, мы можем просто передать имя функции с(), и она будет работать. Это здорово, но я хочу знать, что происходит в фоновом режиме. Почему мы можем сделать это в javascript?Javascript такой же метод подпись

function words(str) { 
    return str.split(" "); 
} 


var sentences = function(newArr){ 
    return newArr.map(words); 
} 
+2

Функции - объекты в javascript. –

+0

Я думаю, что лучший вопрос - почему нет? Вы не упомянули о какой-либо подозрительной теоретической проблеме, почему это не должно работать, так почему бы не разрешить это на языке? – ASDFGerte

+0

Это просто ссылка, она будет такой же, как 'arr.map (function() {})', где обратный вызов вызывается для каждого значения в массиве – adeneo

ответ

1

На многих языках вы можете передать ссылку на функцию в качестве аргумента функции. Это позволяет хост-функции использовать этот аргумент и вызывать эту функцию, когда это необходимо. Это все, что происходит в 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() 
1

Вы являются вызовом функции words неоднократно. Вы вызываете его для каждой итерации функции карты.

Функция карты выполняет обратный вызов, который выполняется для каждой итерации. Этот обратный вызов, как правило, в виде

function (elementOfNewArr, indexOfNewArr, newArr) { }

Поскольку функции являются объектами, вы можете хранить их на переменном и использовать это новое переменное имя для вызова этой функции, а не его оригинал. Это в основном использование функций как объектов. Вы можете бросить их вокруг.

let foo = function() { return 'jasper!'; } 
let boo = foo; 
let ron = boo; // ron() will now return 'jasper!' 

Итак, что вы сделали, хлопнуть в функции обратного вызова, хотя она была определена в другом месте. Поскольку функции обратного вызова, как и все функции, являются объектами, вы можете объявить эту функцию обратного вызова, «сохранить» ее в любой переменной, которую хотите, и использовать ее в любом месте, где вы можете использовать ее в обычном режиме.

Это очень полезно, если вам нужно использовать одну и ту же функцию в нескольких местах.

0

То, что я верю, что вы недоразумение, что сами функции могут рассматриваться так же, как и другие переменные в JavaScript. Рассмотрим следующий пример:

var newArr = [1,2,3,4]; 
newArr.map(function(item){ 
    return item * item; 
}); 

В приведенном выше примере функция передается в качестве аргумента функции map(). Обратите внимание, что это описано анонимно (имя функции не указано). Вы можете сделать точно такую ​​же вещь, как это:

var newArr = [1,2,3,4]; 
function squared(item){ 
    return item * item; 
} 

newArr.map(squared); 

Эти два примера достичь того же, за исключением того, во втором примере, а не писать функции на месте, мы определяем его ранее в коде. Если это помогает, вы можете даже создать функцию таким же образом, как и любой другой обычной переменной:

var squared = function(item){ 
    return item * item; 
}; 

Вы можете передать эту функцию по таким же образом. Если вы хотите узнать разницу между определяющими функциями в этих целях, попробуйте var functionName = function() {} vs function functionName() {}

Смежные вопросы