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 相关文章推荐
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
Nov 19 Javascript
JS delegate与live浅析
Dec 21 Javascript
js中数组(Array)的排序(sort)注意事项说明
Jan 24 Javascript
js 本地预览的简单实现方法
Feb 18 Javascript
用原生js做个简单的滑动效果的回到顶部
Oct 15 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
AngularJS修改model值时,显示内容不变的实例
Sep 13 Javascript
JavaScript实现简单计算器功能
Dec 19 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 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 禁止页面缓存输出
2009/01/07 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php+mysql实现无限级分类
2015/11/11 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
python动态性强类型用法实例
2015/05/09 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
深入浅析python的第三方库pandas
2020/02/13 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python类型转换的魔术方法详解
2020/12/23 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
食品安全标语
2014/06/07 职场文书
分居协议书范本
2014/11/03 职场文书
关于童年的读书笔记
2015/06/26 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸