这篇文章将为大家详细讲解有关js中递归和定时器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
递归:是一个函数通过调用自身的情况下构成的;
首先上个例子:
Function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
这是一个经典的递归阶乘函数,但是在js中这么调用可能会出现一些错误:例如如下代码
var anotherFactorial = factorial; factorial = null; alert(anotherFactorial)// 出错
以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,结果指向原始函数的引用只剩下一个。但再接下来调用anotherFactioral()时候,由于必须执行factorial函数,而factoial已经不再是函数,所以就会导致错误,再这种情况下,使用arguments.callee可以解决这个问题。
arguments.callee是一个指向正在执行的函数的指针,因此可以用来实现对函数的递归调用。
例如:
function factorial (num){ if(num){ return 1; }else{ return num*arguments.callee; } }
arguments.callee 优点:
1、可以确保无论怎样调用函数都不会出问题。因此编写递归函数时候,使用argments.callee总比使用函数名更保险;
注意点:严格模式下无效,会报错
严格模式下写法:
var factorial = (function f(){ if(num<1){ return 1; }else{ return num*f(num-1); } })
二、与定时器的结合使用:
js是单线程语言,但他允许通过设置超时调用和间歇时间来调度代码在特定的时刻执行。前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码。
参数:要执行的代码 和 以 毫秒表示时间
//不建议传字符串,传递字符串可能导致性能损失 setTimeout("alter('hello word')", 1000); //推荐方式 setTimeout(function(){ alter("Hello world"); },1000) setInterval(function(){ alter("Hello world"); },1000)
注意点:结束
超时调用的代码都是在全局作用域执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined;
实际应用中:
使用超时调用来模拟间歇调用是一种最佳模式,在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用之间启动。
var num = 0, max = 0; function incrrmentNumber{ num++; if(num < max){ setTimeout(incrrmentNumber,500); }else{ alert("Done"); } } setTimeout(incrrmentNumber,500);
如果像上面那样使用超时调用,则可以避免这一点。所以不要使用间歇调用;
关于“js中递归和定时器的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。