js 遞歸和定時(shí)器的實(shí)例解析
遞歸:是一個(gè)函數(shù)通過(guò)調(diào)用自身的情況下構(gòu)成的;
首先上個(gè)例子:
Function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
這是一個(gè)經(jīng)典的遞歸階乘函數(shù),但是在js中這么調(diào)用可能會(huì)出現(xiàn)一些錯(cuò)誤:例如如下代碼
var anotherFactorial = factorial; factorial = null; alert(anotherFactorial)// 出錯(cuò)
以上代碼先把factorial()函數(shù)保存在變量anotherFactorial中,然后將factorial變量設(shè)置為null,結(jié)果指向原始函數(shù)的引用只剩下一個(gè)。但再接下來(lái)調(diào)用anotherFactioral()時(shí)候,由于必須執(zhí)行factorial函數(shù),而factoial已經(jīng)不再是函數(shù),所以就會(huì)導(dǎo)致錯(cuò)誤,再這種情況下,使用arguments.callee可以解決這個(gè)問(wèn)題。
arguments.callee是一個(gè)指向正在執(zhí)行的函數(shù)的指針,因此可以用來(lái)實(shí)現(xiàn)對(duì)函數(shù)的遞歸調(diào)用。
例如:
function factorial (num){ if(num){ return 1; }else{ return num*arguments.callee; } }
arguments.callee 優(yōu)點(diǎn):
1、可以確保無(wú)論怎樣調(diào)用函數(shù)都不會(huì)出問(wèn)題。因此編寫(xiě)遞歸函數(shù)時(shí)候,使用argments.callee總比使用函數(shù)名更保險(xiǎn);
注意點(diǎn):嚴(yán)格模式下無(wú)效,會(huì)報(bào)錯(cuò)
嚴(yán)格模式下寫(xiě)法:
var factorial = (function f(){ if(num<1){ return 1; }else{ return num*f(num-1); } })
二、與定時(shí)器的結(jié)合使用:
js是單線程語(yǔ)言,但他允許通過(guò)設(shè)置超時(shí)調(diào)用和間歇時(shí)間來(lái)調(diào)度代碼在特定的時(shí)刻執(zhí)行。前者是在指定的時(shí)間過(guò)后執(zhí)行代碼,而后者則是每隔指定的時(shí)間就執(zhí)行一次代碼。
參數(shù):要執(zhí)行的代碼 和 以 毫秒表示時(shí)間
//不建議傳字符串,傳遞字符串可能導(dǎo)致性能損失 setTimeout("alter('hello word')", 1000); //推薦方式 setTimeout(function(){ alter("Hello world"); },1000) setInterval(function(){ alter("Hello world"); },1000)
注意點(diǎn):結(jié)束
超時(shí)調(diào)用的代碼都是在全局作用域執(zhí)行的,因此函數(shù)中this的值在非嚴(yán)格模式下指向window對(duì)象,在嚴(yán)格模式下是undefined;
實(shí)際應(yīng)用中:
使用超時(shí)調(diào)用來(lái)模擬間歇調(diào)用是一種最佳模式,在開(kāi)發(fā)環(huán)境下,很少使用真正的間歇調(diào)用,原因是后一個(gè)間歇調(diào)用可能會(huì)在前一個(gè)間歇調(diào)用之間啟動(dòng)。
var num = 0, max = 0; function incrrmentNumber{ num++; if(num < max){ setTimeout(incrrmentNumber,500); }else{ alert("Done"); } } setTimeout(incrrmentNumber,500);
如果像上面那樣使用超時(shí)調(diào)用,則可以避免這一點(diǎn)。所以不要使用間歇調(diào)用;
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- js定時(shí)器實(shí)現(xiàn)倒計(jì)時(shí)效果
- JavaScript定時(shí)器詳解及實(shí)例
- JavaScript暫停和繼續(xù)定時(shí)器的實(shí)現(xiàn)方法
- JavaScript 定時(shí)器 SetTimeout之定時(shí)刷新窗口和關(guān)閉窗口(代碼超簡(jiǎn)單)
- JavaScript定時(shí)器setTimeout()和setInterval()詳解
- Javascript 定時(shí)器調(diào)用傳遞參數(shù)的方法
- js 定時(shí)器setTimeout無(wú)法調(diào)用局部變量的解決辦法
- js定時(shí)器+簡(jiǎn)單的動(dòng)畫(huà)效果實(shí)例
- JS動(dòng)畫(huà)定時(shí)器知識(shí)總結(jié)
- JavaScript定時(shí)器設(shè)置、使用與倒計(jì)時(shí)案例詳解
相關(guān)文章
JS實(shí)現(xiàn)圖片的不間斷連續(xù)滾動(dòng)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇JS實(shí)現(xiàn)圖片的不間斷連續(xù)滾動(dòng)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06javascript實(shí)現(xiàn)瀑布流自適應(yīng)遇到的問(wèn)題及解決方案
這篇文章主要介紹了javascript實(shí)現(xiàn)瀑布流自適應(yīng)遇到的問(wèn)題及解決方案,需要的朋友可以參考下2015-01-01使用typescript類(lèi)型來(lái)實(shí)現(xiàn)快排詳情
這篇文章主要介紹了使用typescript類(lèi)型來(lái)實(shí)現(xiàn)快排詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08js實(shí)現(xiàn)獲取兩個(gè)日期之間所有日期的方法
這篇文章主要介紹了js實(shí)現(xiàn)獲取兩個(gè)日期之間所有日期的方法,涉及javascript針對(duì)日期與時(shí)間的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JS清除文本框內(nèi)容離開(kāi)在恢復(fù)及鼠標(biāo)離開(kāi)文本框時(shí)觸發(fā)js的方法
多網(wǎng)站的需要填寫(xiě)的文本框在默認(rèn)狀態(tài)下都會(huì)給出一個(gè)默認(rèn)的提示語(yǔ)言,當(dāng)鼠標(biāo)點(diǎn)擊此文本框的時(shí)候能夠?qū)⒗锩娴哪J(rèn)文本清除,當(dāng)刪除輸入的文本且焦點(diǎn)離開(kāi)文本框的時(shí)候再將默認(rèn)的文本寫(xiě)入文本框2016-01-01將CKfinder整合進(jìn)CKEditor3.0的新方法
最新發(fā)布的CKFinder 1.4版 已經(jīng)提供了對(duì)CKEditor3.0的支持2010-01-01js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果
本文主要介紹了js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03JavaScript實(shí)現(xiàn)仿淘寶商品購(gòu)買(mǎi)數(shù)量的增減效果
最近接了個(gè)項(xiàng)目,要開(kāi)發(fā)一個(gè)地方的O2O租書(shū)項(xiàng)目,使用的是asp.net mvc技術(shù),其中咋圖書(shū)詳情頁(yè),用戶可以輸入借閱的數(shù)量,器實(shí)現(xiàn)此功能的方法是使用了js來(lái)控制數(shù)量的增減和校驗(yàn),對(duì)js實(shí)現(xiàn)商品數(shù)量的增減功能感興趣的朋友一起學(xué)習(xí)吧2016-01-01基于Bootstrap框架實(shí)現(xiàn)圖片切換
這篇文章主要介紹了基于Bootstrap框架實(shí)現(xiàn)圖片切換的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03