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 相关文章推荐
javascript拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
JavaScript var声明变量背后的原理示例解析
Oct 12 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
javascript实现简单加载随机色方块
Dec 25 Javascript
AngularJS控制器继承自另一控制器
May 09 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
JavaScript组合模式学习要点
Aug 26 Javascript
详解angularjs利用ui-route异步加载组件
May 21 Javascript
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 Javascript
可能被忽略的一些JavaScript数组方法细节
Feb 28 Javascript
JS中的防抖与节流及作用详解
Apr 01 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实现Mysql简易操作类
2015/10/11 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
PHP读取Excel类文件
2017/05/15 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
js 可拖动列表实现代码
2011/12/13 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python内置函数delattr的具体用法
2017/11/23 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
Atom的python插件和常用插件说明
2018/07/08 Python
numpy.where() 用法详解
2019/05/27 Python
python文件选择对话框的操作方法
2019/06/27 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Linux上比较文件的命令都有哪些
2012/02/24 面试题
毕业求职自荐信格式是什么
2013/11/19 职场文书
大学生职业生涯规划书模版
2013/12/30 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
开工典礼致辞
2015/07/29 职场文书