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 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
原生JavaScript实现滚动条效果
Mar 24 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 Javascript
JavaScript函数节流的两种写法
Apr 07 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
Jan 10 Javascript
Vue2.0用户权限控制解决方案的示例
Feb 10 Javascript
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
浅析Vue.js中v-bind v-model的使用和区别
Dec 04 Javascript
Jquery获取radio选中值实例总结
Jan 17 jQuery
Vue 2.0双向绑定原理的实现方法
Oct 23 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
Nov 06 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
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
python里大整数相乘相关技巧指南
2014/09/12 Python
简单介绍Python中的struct模块
2015/04/28 Python
Python可变参数函数用法实例
2015/07/07 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
如何基于Python批量下载音乐
2019/11/11 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
如何利用find命令查找文件
2016/11/18 面试题
安全标准化汇报材料
2014/02/03 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书