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 相关文章推荐
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
javaScript基础语法介绍
Feb 28 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
完美实现bootstrap分页查询
Dec 09 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
从0开始学Vue
Oct 27 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
Dec 05 Javascript
Vue三层嵌套路由的示例代码
May 05 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
简单介绍Python中的JSON模块
2015/04/08 Python
Python复制文件操作实例详解
2015/11/10 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
pytorch中的inference使用实例
2020/02/20 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
怀念母亲教学反思
2014/04/28 职场文书
村级个人对照检查材料
2014/08/22 职场文书
晚会开幕词
2015/01/28 职场文书
人工作失职检讨书
2015/05/05 职场文书
城南旧事电影观后感
2015/06/16 职场文书
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers