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 相关文章推荐
Table冻结表头示例代码
Aug 20 Javascript
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
js实现宇宙星空背景效果的方法
Mar 03 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
Nov 02 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
基于javascript实现最简单的选项卡切换效果
May 16 Javascript
基于JavaScript实现轮播图代码
Jul 14 Javascript
打造自己的jQuery插件入门教程
Sep 23 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
Jan 05 Javascript
分享ES6的7个实用技巧
Jan 18 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
JS实现容器模块左右拖动效果
Jan 14 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
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
试用php中oci8扩展
2015/06/18 PHP
使用URL传输SESSION信息
2015/07/14 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python简单实现获取当前时间
2016/08/27 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python协程之动态添加任务的方法
2019/02/19 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
应届生个人求职信模板
2013/11/26 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
城管个人总结
2015/02/28 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript