2016-08-06 9 views
0

Здесь я пытаюсь сделать оба divs красным, через обратный вызов. Однако он работает только для одного, а не для обоих.Способ обратного вызова функции

Я знаю, это, вероятно, не очень умный вопрос, но я действительно трачу несколько часов, пытаясь понять, почему это не работает.

Что в этом плохого?

<div id="foo">foo</div> 
<div id="bar">bar</div> 

<script> 

function foo() { 
    document.querySelector("#foo").style.color = "red"; 
} 

function bar() { 
    document.querySelector("#bar").style.color = "red"; 
} 

foo(bar); 

</script> 
+2

Как именно вы ожидали его на работу? 'bar' никогда не вызывается, а' foo' игнорирует переданные аргументы. – Oriol

+0

@james, просто измените 'foo (bar);' to 'foo(); бар(); '. Пожалуйста, не используйте принятый в настоящее время ответ. – Thomas

ответ

3

При вызове foo(bar), он передает функцию bar в качестве аргумента foo. Тем не менее, foo не содержит никаких аргументов, и вы также не вызываете bar. Измените свою функцию foo так.

function foo(callback) { 
    document.querySelector("#foo").style.color = "red"; 
    callback(); 
} 

Update

Это решение не является лучшей практикой, однако для вашей ситуации. То, что вы пытаетесь выполнить, не требует обратного вызова. Вы должны сделать одно из следующего.

  • Объединить эти две функции в одну.
  • Звоните foo и bar вместе.

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

+1

пожалуйста, не делайте пожалуйста. просто вызовите обе функции: 'foo(); bar(); 'или поместить код обеих функций в один:' function foo() { document.querySelector ("# foo"). style.color = "red"; document.querySelector ("# bar"). Style.color = "red"; } 'и просто называть' foo(); ' – Thomas

+0

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

+0

Да, у меня это есть, но, как он спрашивает, показывает, что у него нет опыта, чтобы понять ваши намерения. Я просто волнуюсь, что он может подумать, что это будет правильный способ пойти/написать такие вещи. – Thomas

0

У вас есть две функции, но только вызовом одного:

foo(bar); 

проходит только bar функцию foo, которая ничего не делает с ним.

, чтобы получить эту работу называют обе функции:

foo(); 
bar();