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 相关文章推荐
JavaScript动态改变HTML页面元素例如添加或删除
Aug 10 Javascript
JS实现一个按钮的方法
Feb 05 Javascript
jQuery实现简洁的导航菜单效果
Nov 23 Javascript
基于javascript实现的购物商城商品倒计时实例
Dec 11 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
详解微信第三方小程序代开发
Jun 23 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 Javascript
值得收藏的八个常用的js正则表达式
Oct 19 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
Jan 18 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
Jan 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
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
AngularJS语法详解
2015/01/23 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
Vue实现日历小插件
2019/06/26 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
利用python绘制正态分布曲线
2021/01/04 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
财务会计应届生求职信
2013/11/24 职场文书
水电工岗位职责
2014/02/12 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
国庆横幅标语
2014/10/08 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
干部培训工作总结2015
2015/05/25 职场文书
2015年暑假生活总结
2015/07/13 职场文书
小学教师教学反思
2016/02/24 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle