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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
JS图片无缝、平滑滚动代码
Mar 11 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
javascript的BOM汇总
Jul 16 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
JS实现的幻灯片切换显示效果
Sep 07 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
Apr 10 Javascript
Bootstrap table使用方法汇总
Nov 17 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
如何优化vue打包文件过大
Apr 13 Vue.js
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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
php里array_work用法实例分析
2015/07/13 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
浅谈js的异步执行
2016/10/18 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
Python 自动补全(vim)
2014/11/30 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
python uuid模块使用实例
2015/04/08 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
python hashlib加密实现代码
2019/10/17 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
2014年教师业务工作总结
2014/12/19 职场文书
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers