При работе с некоторым javascript я столкнулся с поведением, которое меня озадачивает, и я ищу документацию, которая объясняет, что происходит.Передача функций javascript как параметров
Проблема заключается в том, что в зависимости от того, как передаются функции, они могут выполняться, когда я думаю, что они просто параметры.
Вот простой пример:
function f1()
{
alert('f1');
}
function f2()
{
alert('f2');
}
function f3(a, b)
{
alert('f3');
}
две версии вызова выше:
f3(f1, f2); // shows 1 alert
f3(f1(), f2()); // shows 3 alerts
Первый вызов f3 выше результатов в функции f1 и f2 не вызывается и вам получите одно предупреждение для «f3». Второй вызов функций f3 вызывается, поэтому вы получаете три предупреждения для «f1», «f2» и «f3».
В фактическом коде я буду использовать первую версию, чтобы f3 мог решить, хочет ли он звонить f1 и f2. Мне потребовалось немного времени, чтобы все исправить.
Я не ожидал такого поведения и думал, что либо с круглой скобкой, либо без нее, f1 и f2 не будут вызваны просто их параметрами.
Опять же, я ищу документацию, которая объясняет, как это работает.
Документация, которую вы должны знать, состоит в том, что '()' вызывает функцию, иначе вы просто ссылаетесь на функцию. Ваша первая строка передает ссылки на функции 'f1' и' f2', на 'f3'. Ваша вторая строка сразу вызывает 'f1' и' f2' и передает их возвращаемые значения (которые 'undefined', потому что они ничего не возвращают) до' f3'. Поскольку 'f3' ничего не делает с' a' и 'b', не имеет значения, что вы передаете – Ian
, если вы их вызываете, вы передаете возврат функции в качестве параметра, а не самой функции. поскольку аргументы разрешаются до передачи, js не имеет представления о том, что на самом деле произошло в вызове. В вашем случае все функции возвращаются undefined, но поскольку вы никогда не используете аргументы, все это не имеет значения. – dandavis
Некоторые языки имеют возможность отсрочить вызов функции. У JavaScript таких возможностей нет. Когда вы его назовете, это называется немедленно. –