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代码
Mar 26 Javascript
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
ie8模式下click无反应点击option无反应的解决方法
Oct 11 Javascript
jQuery中prop()方法用法实例
Jan 05 Javascript
Javascript数组Array方法解读
Mar 13 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 Javascript
js实现选项卡效果
Mar 07 Javascript
原生js实现无缝轮播图效果
Jan 28 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数据库中并显示的实现代码
2010/05/27 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
php7下的filesize函数
2019/09/30 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现class对象转换成json/字典的方法
2016/03/11 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
Python整数对象实现原理详解
2019/07/01 Python
Django框架 信号调度原理解析
2019/09/04 Python
如何使用python进行pdf文件分割
2019/11/11 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
家长给老师的道歉信
2014/01/13 职场文书
自我推荐信范文
2014/05/09 职场文书
监理中标通知书
2015/04/16 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
Python中的socket网络模块介绍
2022/07/23 Python