SetInterval和SettimeOut(转载文章)
?
學(xué)過JavaScript?腳本語言的都應(yīng)該接觸過setInterval 函數(shù).如何使用我想大家都知道,但是有時(shí)候還是會(huì)在使用的時(shí)候碰到這樣或那樣的問題。下面的問題也是在QQ群經(jīng)常碰到有人問的最多的,問題如下圖:
首先聲明:本人技術(shù)水平很低,以下所訴完全是依照自己的理解來做一些說明。如果有不當(dāng)之處,還請(qǐng)批評(píng)斧正!以下僅僅是對(duì)自己理解,就當(dāng)完事扯蛋吧!其內(nèi)容都非常淺顯,聊的多了自己也搞不定了!因?yàn)檎娴呐鲁兜俺短哿?#xff01;
? ?? ?在JavaScript中的setInterval() 方法可按照指定的周期(以毫秒計(jì))來調(diào)用函數(shù)或計(jì)算表達(dá)式。setInterval() 方法會(huì)不停地調(diào)用函數(shù),直到 clearInterval() 被調(diào)用或窗口被關(guān)閉。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的參數(shù)來將其停止。
其實(shí)提上對(duì)函數(shù)的調(diào)用均能執(zhí)行。首先我們看以下代碼
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | ???<!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);//全局作用域下正常執(zhí)行 ????????setInterval(fun(),1000); //調(diào)用函數(shù)正常,setInterval調(diào)用出錯(cuò) ????????setInterval(fun,1000);? //正確 ????</script> </head> <body> </body> </html> |
? ? 我所給出的代碼和提問題人是一樣的,唯一的區(qū)別就是函數(shù)名不同罷了!如果大家做了相關(guān)測(cè)試都應(yīng)該知道,就以上代碼來說都會(huì)彈出結(jié)果1.
當(dāng)然以上代碼其執(zhí)行環(huán)境為全局。setInterval 第一個(gè)參數(shù) 可以是函數(shù)名、匿名函數(shù)、函數(shù)的引用以及其他可執(zhí)行代碼。
| 1 | setInterval("fun()",1000); |
其中這種加引號(hào)的調(diào)用就可以理解為 可執(zhí)行代碼??就行eval 一樣去執(zhí)行第一個(gè)參數(shù),就是對(duì)fun方法的調(diào)用 理所當(dāng)然的彈出 1??一秒鐘間隔,一直執(zhí)行。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 1 | setInterval(fun(),1000); |
而這個(gè)調(diào)用我就不理解使用者通過這種方式使用setInterval 的意圖為何.
fun() 是對(duì)函數(shù)的直接調(diào)用,也就是說當(dāng)setInterval還沒有開始函數(shù)func就執(zhí)行了。如果這個(gè)函數(shù)沒有返回值或者返回值不是可執(zhí)行的函數(shù)或者其他的代碼的話,就以上代碼而言只是彈出1,之后就遍報(bào)錯(cuò)了.
難道這樣的調(diào)用真的不可以嗎?其實(shí)是可以的!例如代碼:
| 1 2 3 4 5 6 | ??????function funone() { ??????????return function () { ????????????alert("qishiwoyenengzhixing") ??????????} ??????} setInterval(funone(), 1000);//你敢說我不能執(zhí)行? |
我個(gè)人認(rèn)為這種設(shè)計(jì)或者調(diào)用完全沒有任何意義,用其他的方法就行了。
--------------------------------------------------------------------------------------------------------------
| 1 | setInterval(fun,1000); //這種方法是正確的。 |
大家可以把這種調(diào)用setInterval的第一個(gè)參數(shù)看作參數(shù)為 函數(shù)名或函數(shù)的引用。當(dāng)然我們還可以這樣調(diào)用,使用匿名函數(shù)。
| 1 2 3 4 | setInterval(function () { ????????????alert("我一秒中執(zhí)行一次"); ????????}, 1000) |
---------------------------------------------------------------------------------------------------------------
有些人可能發(fā)現(xiàn),在全局作用域下??setInterval("fun()",1000); 可以正常執(zhí)行,但放到window.onload函數(shù)中卻不能執(zhí)行。為什么呢?
先請(qǐng)看代碼:
| 1 2 3 4 5 6 7 8 9 | window.onload = function () { ????????????function fun() { ????????????????alert(1); ????????????} ?????????????setInterval("fun()",1000);//這個(gè)報(bào)錯(cuò)了 未定義?? 重點(diǎn)在這一個(gè) ????????????// setInterval(fun(), 3000); //這個(gè)和剛才全局的表現(xiàn)一樣 ???????????// setInterval(fun,1000);//這個(gè)沒有問題 ????????} |
setInterval("fun()",1000); 這種調(diào)用報(bào)未定義,在全局我們已經(jīng)說過了 。我們可以把帶引號(hào)的參數(shù)理解為 可執(zhí)行代碼 。
而setInterval現(xiàn)在把以引號(hào)包括的可執(zhí)行代碼進(jìn)行處理。就像eval一樣給予執(zhí)行。其在執(zhí)行中 fun() 執(zhí)行環(huán)境發(fā)生了變化,不是在window.onload方法下,而是在全局環(huán)境中也就是window.大家應(yīng)該知道JavaScript存在作用域鏈,由內(nèi)向外依次查找。內(nèi)部可以訪問其上層的函數(shù)和變量,而外部卻不能訪問內(nèi)部的函數(shù)和變量。JavaScript有一個(gè)預(yù)編譯處理,首先對(duì)函數(shù)和變量進(jìn)行預(yù)編譯。也就是說其函數(shù)和變量作用域是在其聲明的時(shí)候確定的,而不是在執(zhí)行的時(shí)候確定。當(dāng)setInterval把"fun()"執(zhí)行環(huán)境換為全局的后,對(duì)fun的調(diào)用是無效的。因?yàn)槿植荒茉L問局部的函數(shù)和變量。window.onload相對(duì)于window來說就是局部的。
對(duì)與setInterval(fun(), 3000)和setInterval(fun,1000)調(diào)用其執(zhí)行I環(huán)境并沒有改變,所以是可以訪問的到的。只不過setInterval(fun(), 3000)執(zhí)行后 會(huì)報(bào)錯(cuò)的,其調(diào)用錯(cuò)誤。在之前已經(jīng)講過了,這里就不啰嗦了!
------------------------------------------------------------------------------------------------
為了讓大家明白 setInterval("fun()",1000)??的調(diào)用是以可執(zhí)行代碼 執(zhí)行。給出以下代碼共大家測(cè)試:
| 1 2 3 4 | function fun() { ????????????alert(1); ????????} ????????setInterval("alert(fun)",2000); |
| 1 | setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //大家說這個(gè)會(huì)是什么呢 ? |
轉(zhuǎn)載于:https://www.cnblogs.com/musi-shuang/p/5322405.html
總結(jié)
以上是生活随笔為你收集整理的SetInterval和SettimeOut(转载文章)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcatserverhttps协议配
- 下一篇: 各种清浮动方法总结