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


Posted in Javascript onFebruary 03, 2017

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

首先上个例子:

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

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

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

Javascript 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
AngularJS实现网站换肤实例
Feb 19 Javascript
详解Vue自定义过滤器的实现
Jan 10 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
详解vue-cli快速构建vue应用并实现webpack打包
Dec 13 Javascript
详解React项目中碰到的IE问题
Mar 14 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 Javascript
js实现文本上下来回滚动
Feb 03 #Javascript
jquery代码规范让代码越来越好看
Feb 03 #Javascript
Javascript for in的缺陷总结
Feb 03 #Javascript
canvas绘制七巧板
Feb 03 #Javascript
JS对象是否拥有某属性如何判断
Feb 03 #Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 #Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 #Javascript
You might like
PHP 面向对象 final类与final方法
2010/05/05 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
使用php计算排列组合的方法
2013/11/13 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
前端性能优化建议
2020/09/17 Javascript
python 随机数生成的代码的详细分析
2011/05/15 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python如何求解两数的最大公约数
2018/09/27 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
工商管理毕业生推荐信
2013/12/24 职场文书
小学班级特色活动方案
2014/08/31 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
开学第一天的感想
2015/08/10 职场文书
教师节主题班会教案
2015/08/17 职场文书