2013-06-29 5 views
2

При работе с некоторым 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 не будут вызваны просто их параметрами.

Опять же, я ищу документацию, которая объясняет, как это работает.

+6

Документация, которую вы должны знать, состоит в том, что '()' вызывает функцию, иначе вы просто ссылаетесь на функцию. Ваша первая строка передает ссылки на функции 'f1' и' f2', на 'f3'. Ваша вторая строка сразу вызывает 'f1' и' f2' и передает их возвращаемые значения (которые 'undefined', потому что они ничего не возвращают) до' f3'. Поскольку 'f3' ничего не делает с' a' и 'b', не имеет значения, что вы передаете – Ian

+0

, если вы их вызываете, вы передаете возврат функции в качестве параметра, а не самой функции. поскольку аргументы разрешаются до передачи, js не имеет представления о том, что на самом деле произошло в вызове. В вашем случае все функции возвращаются undefined, но поскольку вы никогда не используете аргументы, все это не имеет значения. – dandavis

+0

Некоторые языки имеют возможность отсрочить вызов функции. У JavaScript таких возможностей нет. Когда вы его назовете, это называется немедленно. –

ответ

2

В вашей вторая строка:

f3(f1(), f2()); 

Ваш не прохождениеf1 и f2, вы вызываете , вызывая и передавая их (неопределенные) значения возврата в f3.

+0

Простой и точный, любите подобные ответы – Mataniko

0

Вы ошибаетесь в логике. Вы передаете параметры, которые вы никогда не используете, но давайте катимся с пуансонами.

Ваш вопрос касается количества аварийных сигналов; Вы передаете параметры функции, которые никогда не используют их, и вы вызываете ее. так, что происходит на самом деле:

function f3(a, b) 
{ 
console.log("argument 1: " + arguments[0]); //Access the arguments fed to the function 
console.log("argument 2: " + arguments[1]); 
    alert('f3'); 
} 
* 

f3(f1, f2); Pops оповещать "f3" *

and logs: 
argument 1: function f1() 
{ 
    alert('f1'); 
} 
argument 2: function f2() 
{ 
    alert('f2'); 
} 

f3(f1(),f2())

хлопки все оповещения и журналы:

argument 1 undefined 
argument 2 undefined 
+0

Никогда не используйте эти функции, потому что это пример игрушек, лишенный всех экстраординарных функций. Конечно, в реальном коде эти функции имеют цель и используются. –

1

Проще говоря, добавление функции() к функции даже при передаче в качестве параметра вызовет функцию немедленно. Пример установки тайм-аут:

function doStuff() { 
    alert("ok"); 
} 

setTimeout(doStuff(), 300); 

Вы будете предупреждены ok немедленно, потому что функция немедленно вызывается. Установка тайм-аута с:

setTimeout(doStuff, 300); 

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

В функции AJAX callback вы обычно увидите функции, переданные в качестве параметров, подобных этому.

Документация setTimeout имеет большой раздел, посвященный функциям обратного вызова: https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

(Да я понимаю setTimeout не был использован в этом вопросе, но я чувствовал, этот пример помог ответить на вопрос, красиво)

0

Когда функция имеет параметры его очень ясно, что скобка используется немедленно вызвать его

function sum(a, b){ 
    return a + b; 
} 

console.log(sum(1, 2)); //prints 3 

версия f() является лишь частным случаем этого, где ваш список параметров пуст.

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