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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
javascript 延迟加载技术(lazyload)简单实现
Jan 17 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
Jan 15 Javascript
JavaScript中神奇的call()方法
Mar 12 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
Nov 09 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
webpack2.0搭建前端项目的教程详解
Apr 05 Javascript
js判断节假日实例代码
Dec 27 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
php下Memcached入门实例解析
2015/01/05 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
python如何去除字符串中不想要的字符
2020/07/05 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python sleep和wait对比总结
2021/02/03 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
小车司机岗位职责
2013/11/25 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
人事任命通知书
2015/04/21 职场文书
如何写好开幕词?
2019/06/24 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL