Bo to jest wywołanie funkcji document.write:
document.write(myvar)
Jak używasz go w ten sposób z setInterval:
setInterval(document.write(myvar), 1000);
To tak naprawdę jako pierwszy parametr funkcji setInterval podajesz WYNIK działania funkcji document.write. Przy czym document.write jest wywoływana natychmiast.
Może na innym przykładzie. Powiedzmy, że masz taką funkcję:
function alertAndReturn4() {
alert("Cztery");
return 4;
}
Jeśli zastosujesz coś takiego:
setInterval(alertAndReturn4(), 1000);
To natychmiast wywołujesz funkcję alertAndReturn4
-- bo te nawiasy ()
oznaczają wywołanie funkcji. Nasza funkcja jest wywoływana, wyświetla komunikat "Cztery" oraz zwraca wynik: liczbę 4. To właśnie ten wynik -- liczbę 4 -- przekazujesz do setInterval. Czyli tak, jakbyś napisał:
setInterval(4, 1000);
Bez sensu, prawda?
Do setInterval chcesz podstawić funkcję (której nie chcesz natychmiast wywoływać -- tym ma się zająć setInterval), a nie wynik wywołania funkcji. Musisz więc pominąć nawiasy ()
i napisać samą nazwę funkcji:
setInterval(alertAndReturn4, 1000);
To już zadziała. Przekazuje do setInterval
funkcję alertAndReturn4
i ona będzie wywoływana co ok. sekundę. Co sekundę pojawi się więc komunikat.
Powstaje problem gdy chcesz przekazać funkcję, która oczekuje jakiegoś argumentu. Np. document.write
oczekuje argumentu będącego napisem, który trzeba wyświetlić. Argumenty podaje się w nawiasach, a nawiasy oznaczają wywołanie funkcji, więc nie możesz ich użyć.
Możesz napisać funkcję opakowującą, która sama nie będzie potrzebowała argumentów, a wywoła funkcję z argumentami. W Twoim przypadku chcesz wywołać funkcję z argumentem document.write(myvar)
. Napisz więc sobie funkcję o nazwie np. writeMyVar
:
// możesz to wstawić np. na początku skryptu
function writeMyVar() {
document.write(myvar);
}
Zauważ, że nasza funkcja writeMyVar
nie potrzebuje argumentów. Można ją więc przekazać do setInterval w działający sposób, bez wywoływania, tj. bez nawiasów:
setInterval(writeMyVar, 1000);
To dość częsty przypadek: tworzymy funkcję, której używamy tylko raz. Na szczęście JavaScript to język funkcyjny i pozwala na robienie różnych cudów z funkcjami. Np. pozwala na tworzenie funkcji anonimowych. Czyli takich, które nie mają nazwy. Skoro nie mają nazwy, to nie ma do nich normalnego dostępu i nie można ich wywoływać jak się chce. Ale można je wstawić w dowolne miejsce: tam, gdzie są potrzebne.
Napiszemy teraz funkcję anonimową, która robi dokładnie to samo co writeMyVar
. Tyle że wstawimy ją od razu tam, gdzie ma się znaleźć -- jako argument setInterval -- i nie nadamy jej nazwy, bo nie potrzeba (i tak się nie będziemy do tej funkcji nigdzie indziej odnosić):
setInterval(function() {
document.write(myvar);
}, 1000);
I to jest rozwiązaniem Twojego problemu.