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 相关文章推荐
浮动的div自适应居中显示的js代码
Dec 23 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
jQuery解析XML 详解及方法总结
Sep 28 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
ES6基础之展开语法(Spread syntax)
Feb 21 Javascript
浅谈vue权限管理实现及流程
Apr 23 Javascript
k8s node节点重新加入master集群的实现
Feb 22 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
高中家长寄语
2014/04/02 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
劳动保障个人工作总结
2015/03/04 职场文书