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 相关文章推荐
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
javascript dom追加内容实现示例
Sep 21 Javascript
javascript中expression的用法整理
May 13 Javascript
JavaScript也谈内存优化
Jun 06 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
Aug 22 Javascript
jQuery插件pagination实现无刷新分页
May 21 Javascript
JS产生随机数的几个用法详解
Jun 22 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
Node 升级到最新稳定版的方法分享
May 17 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
寻找网站后台地址的python脚本
2014/09/01 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
python实现字符串和数字拼接
2020/03/02 Python
Python 实现简单的客户端认证
2020/07/29 Python
运动会800米加油稿
2014/02/22 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
志愿者事迹材料
2014/12/26 职场文书
司机个人年终总结
2015/03/03 职场文书
单位计划生育责任书
2015/05/09 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
Python中常见的导入方式总结
2021/05/06 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android