js 递归和定时器的实例解析

网络编程 2021-07-04 19:20www.168986.cn编程入门
本文主要介绍了js递归和定时器的相关知识。具有很好的参考价值,狼蚁网站SEO优化跟着长沙网络推广一起来看下吧

递归是一个函数通过调用自身的情况下构成的;

上个例子

Function factorial(num){
 if(num<=1){
 return 1;
 }else{
 return numfactorial(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 numarguments.callee;
 }
}

arguments.callee 优点

1、可以确保无论怎样调用函数都不会出问题。编写递归函数时候,使用argments.callee总比使用函数名更保险;

注意点严格模式下无效,会报错

严格模式下写法

var factorial = (function f(){
 if(num<1){
 return 1;
 }else{
 return numf(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);

如果像上面那样使用超时调用,则可以避免这一点。所以不要使用间歇调用;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望多多支持狼蚁SEO!

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by