Bo to jest wywołanie funkcji document.write:
Kopiuj
document.write(myvar)
Jak używasz go w ten sposób z setInterval:
Kopiuj
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ę:
Kopiuj
function alertAndReturn4() {
alert("Cztery");
return 4;
}
Jeśli zastosujesz coś takiego:
Kopiuj
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ł:
Kopiuj
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:
Kopiuj
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:
Kopiuj
// 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:
Kopiuj
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ć):
Kopiuj
setInterval(function() {
document.write(myvar);
}, 1000);
I to jest rozwiązaniem Twojego problemu.