在JavaScript中的setInterval() 方法可按照指定的周期(以毫秒計)來調用函數或計算表達式。setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的參數來將其停止。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> function fun() { alert(1); } setInterval("fun()",1000);//全局作用域下正常執行 setInterval(fun(),1000); //調用函數正常,setInterval調用出錯 setInterval(fun,1000); //正確 </script> </head> <body> </body> </html>
以上代碼來說都會彈出結果1.
當然以上代碼其執行環境為全局。setInterval 第一個參數 可以是函數名、匿名函數、函數的引用以及其他可執行代碼。
setInterval("fun()",1000);
其中這種加引號的調用就可以理解為 可執行代碼 就行eval 一樣去執行第一個參數,就是對fun方法的調用 理所當然的彈出 1 一秒鍾間隔,一直執行.
setInterval(fun(),1000);
而這個調用我就不理解使用者通過這種方式使用setInterval 的意圖為何.
fun() 是對函數的直接調用,也就是說當setInterval還沒有開始函數func就執行了。如果這個函數沒有返回值或者返回值不是可執行的函數或者其他的代碼的話,就以上代碼而言只是彈出1,之后就遍報錯了.
難道這樣的調用真的不可以嗎?其實是可以的!例如代碼:
function funone() { return function () { alert("qishiwoyenengzhixing") } } setInterval(funone(), 1000);//你敢說我不能執行?
我個人認為這種設計或者調用完全沒有任何意義,用其他的方法就行了。
setInterval(fun,1000); //這種方法是正確的。
大家可以把這種調用setInterval的第一個參數看作參數為 函數名或函數的引用。當然我們還可以這樣調用,使用匿名函數。
setInterval(function () { alert("我一秒中執行一次"); }, 1000)
有些人可能發現,在全局作用域下 setInterval("fun()",1000); 可以正常執行,但放到window.onload函數中卻不能執行。為什么呢?
先請看代碼:
window.onload = function () { function fun() { alert(1); } setInterval("fun()",1000);//這個報錯了 未定義 重點在這一個 // setInterval(fun(), 3000); //這個和剛才全局的表現一樣 // setInterval(fun,1000);//這個沒有問題 }
setInterval("fun()",1000); 這種調用報未定義,在全局我們已經說過了 。我們可以把帶引號的參數理解為 可執行代碼 。
而setInterval現在把以引號包括的可執行代碼進行處理。就像eval一樣給予執行。其在執行中 fun() 執行環境發生了變化,不是在window.onload方法下,而是在全局環境中也就是window.大家應該知道JavaScript存在作用域鏈,由內向外依次查找。內部可以訪問其上層的函數和變量,而外部卻不能訪問內部的函數和變量。JavaScript有一個預編譯處理,首先對函數和變量進行預編譯。也就是說其函數和變量作用域是在其聲明的時候確定的,而不是在執行的時候確定。當setInterval把"fun()"執行環境換為全局的后,對fun的調用是無效的。因為全局不能訪問局部的函數和變量。window.onload相對於window來說就是局部的。
對與setInterval(fun(), 3000)和setInterval(fun,1000)調用其執行環境並沒有改變,所以是可以訪問的到的。只不過setInterval(fun(), 3000)執行后 會報錯的,其調用錯誤。在之前已經講過了,這里就不啰嗦了!
------------------------------------------------------------------------------------------------
為了讓大家明白 setInterval("fun()",1000) 的調用是以可執行代碼 執行。給出以下代碼共大家測試:
var a =10; var b = 20; var c = a+b; window.onload = function(){ var a =1; var b = 2; var c = a+b; setInterval("alert(c);",1000); //30 }
function fun() { alert(1); } setInterval("alert(fun)",2000);
setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //大家說這個會是什么呢 ?