当前位置:首页 > 日记 > 正文

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

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);

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

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

相关文章

基于Vue实例生命周期 | 全面解析

基于Vue实例生命周期 | 全面解析

生命周期,实例,电脑软件,Vue,前面的话Vue实例在创建时有一系列的初始化步骤,例如建立数据观察,编译模板,创建数据绑定等。在此过程中,我们可以通过一些定义好的生命周期钩子函数来运行业务逻辑。本文将详细介绍Vue实例的生命周期图示下图是Vue…

微信小程序实现轮播图效果

微信小程序实现轮播图效果

轮播图,效果,程序,电脑软件,微信小,微信小程序实现轮播图,和网站,APP的效果差不多,代码少,效率高。先来看看效果图:主要用swiper + swiper-item来实现<view class='swiper'>滑块视图容器</view><!-- indicator-dots='true' 是否显示指示点 …

浅谈Vue.js 1.x 和 2.x 实例的生命

浅谈Vue.js 1.x 和 2.x 实例的生命

生命周期,浅谈,实例,电脑软件,Vue,在Vue.js中,在实例化Vue之前,它们都是以HTML的文本形式存在文本编辑器中。当实例化后将经历创建、编译、销毁三个主要阶段。以下是Vue.js 1.x 实例的生命周期图示:Vue.js 1.x 的生命周期钩子 1. init 在实例…

PS简单制作阳光穿越厚厚的云层效果

PS简单制作阳光穿越厚厚的云层效果

阳光,云层,效果,简单,电脑软件,今天小编为大家分享PS简单制作阳光穿越厚厚的云层效果方法,教程很简单,对于初学者来说,可以通过这篇文章学习如何制作阳光效果的方法,好了,下面我们一起来学习吧!最终效果图: 步骤:本期为您分享如上图制作的"穿越云…

PHP获取文件扩展名的方法实例总结

PHP获取文件扩展名的方法实例总结

方法,实例,文件扩展名,电脑软件,PHP,本文实例总结了PHP获取文件扩展名的方法。分享给大家供大家参考,具体如下:在PHP面试中或者考试中会有很大几率碰到写出五种获取文件扩展名的方法,下面是我自己总结的一些方法$file = '需要进行获取扩展名…

IIS部署asp.net mvc网站的方法

IIS部署asp.net mvc网站的方法

方法,网站,电脑软件,asp,IIS,iis配置简单的ASP.NET MVC网站,供大家参考,具体内容如下编译器:VS 2013本地IIS:IIS 7操作系统:win 7MVC版本:ASP.NET MVC4sql server版本: 2008 r2打开VS 2013,新建一个MVC项目(Internet版的),然后在本地上运行测试下,…

新的滤镜怎么下载添加进PS中

新的滤镜怎么下载添加进PS中

下载,滤镜,方法,电脑软件,PS,   在ps中很多地方都需要用到新的滤镜,我们可以试试下载之后添加进ps中使用。很多刚学习的新手小伙伴可能还不知道,下面是小编带来关于新的滤镜怎么下载添加进PS中的内容,希望可以让大家有所收获!  新的滤镜下…

Word2016中如何使用模板创建文档

Word2016中如何使用模板创建文档

文档,模板,方法,如何使用,电脑软件,  在启动word文档后,用户可以根据自己的需要创建新文档。此时,用户也可以选择word的设计模板来创建文档。以下是小编为您带来的关于Word2016中使用模板创建文档的方法,希望对您有所帮助。Word2016中使用模…

Node.js 8 中的 util.promisify的

Node.js 8 中的 util.promisify的

详解,电脑软件,js,Node,promisify,Node.js 8 于上个月月底正式发布,带来了 很多新特性 。其中比较值得注意的,便有 util.promisify() 这个方法。util.promisify()虽然 Promise 已经普及,但是 Node.js 里仍然有大量的依赖回调的异步函数,如果我…

setTimeout函数的神奇使用

setTimeout函数的神奇使用

函数,神奇,电脑软件,setTimeout,【写在前面的胡言乱语】自从大三开始实习之后,就没有写博客了,虽然学了很多东西,但是如果没有进行总结和分享,学的东西就很容易忘记,而且不进行分享,就不会手动去敲代码,这样对知识的理解就不够透彻。现在毕业半年…

Node学习记录之cluster模块

Node学习记录之cluster模块

模块,学习,电脑软件,Node,cluster,在如今机器的CPU都是多核的背景下,Node的单线程设计已经没法更充分的"压榨"机器性能了。所以从v0.8开始,Node新增了一个内置模块——“cluster”,故名思议,它可以通过一个父进程管理一坨子进程的方式来实现…

自定义事件解决重复请求BUG的问题

自定义事件解决重复请求BUG的问题

请求,自定义事件,电脑软件,BUG,现在,组件化开发还是比较流行的,毕竟其优点相当突出。最近在开发一个组件的时候,遇到了一个很有意思的BUG。。。BUG的背景最近在开发一个组件,好不容易开发好了转测试。然后,测试给我提了一个这样的bug,orz...因为…