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库(迷你版)--自建js库总结
Nov 21 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
javascript制作sql转换为stringBuffer的小工具
Apr 03 Javascript
CSS图片响应式 垂直水平居中
Aug 14 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
May 17 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
微信小程序 跳转方式总结
Apr 20 Javascript
将angular-ui的分页组件封装成指令的方法详解
May 10 Javascript
js实现简易计算器功能
Oct 18 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 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使用qr生成二维码的示例分享
2014/01/20 PHP
php正则表达式学习笔记
2015/11/13 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
Extjs学习笔记之七 布局
2010/01/08 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
常见python正则用法的简单实例
2016/06/21 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
python逆序打印各位数字的方法
2018/06/25 Python
在python中实现对list求和及求积
2018/11/14 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python圣诞树编写实例详解
2020/02/13 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
寒假家长评语大全
2014/04/16 职场文书
独生子女证明范本
2015/06/19 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
Ajax实现三级联动效果
2021/10/05 Javascript
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android