欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js 遞歸和定時(shí)器的實(shí)例解析

 更新時(shí)間:2017年02月03日 16:28:22   作者:?jiǎn)蜗壬? 
本文主要介紹了js遞歸和定時(shí)器的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

遞歸:是一個(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í)也希望多多支持腳本之家!

相關(guān)文章

最新評(píng)論