Насколько эти две функции эквивалентны? - PullRequest
0 голосов
/ 08 мая 2019

Я читаю книгу В основном адекватное руководство, и в главе о функциях первого класса я натолкнулся на этот пример.Кто-нибудь может мне это объяснить?

Там написано, что две строки ниже равны.

// ignorant
const getServerStuff = callback => ajaxCall(json => callback(json));

// enlightened
const getServerStuff = ajaxCall;

Вот причина, по которой оба они эквивалентны:

// this line
ajaxCall(json => callback(json));

// is the same as this line
ajaxCall(callback);

// so refactor getServerStuff
const getServerStuff = callback => ajaxCall(callback);

// ...which is equivalent to this
const getServerStuff = ajaxCall; // <-- look mum, no ()'s

Но яне могу выполнить эту часть.Как эти два эквивалента?

// this line
ajaxCall(json => callback(json));

// is the same as this line
ajaxCall(callback);

Может кто-нибудь объяснить это в терминах непрофессионала?

1 Ответ

3 голосов
/ 08 мая 2019

Они эквивалентны, потому что в первой строке вводится анонимная функция, которая ничего не делает, кроме как направляет свой аргумент на callback и возвращает возвращаемое значение callback.

Вообще говоря, функция x, которая ничего не делает, кроме пересылки своих аргументов какой-либо другой функции y и возврата результата, может быть заменена внутренней функцией y. x не делает ничего значимого.

Итак, с учетом функции x ...

function x(arg) { return y(arg) }

Здесь мы определяем функцию x. Цель x - принять аргумент arg и вызвать y(arg). Однако у нас уже есть средства для вызова y(arg), если у нас есть y, и у нас есть arg: , просто вызывая y(arg). Для этого нам не нужно вводить новую функцию x.


Стоит отметить, что две строки в вашем вопросе эквивалентны только тогда, когда ajaxCall вызывает свой обратный вызов с одним аргументом. Чтобы они были равны истинно , в первой строке должны быть указаны все аргументы:

ajaxCall(...json => callback(...json));
...