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 继承实例分析
Nov 04 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
浅析jquery unbind()方法移除元素绑定的事件
May 24 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
Jun 12 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
Oct 17 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
三种Webpack打包方式(小结)
Sep 19 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
Aug 29 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 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
PHP4之真OO
2006/10/09 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
如何理解Python中的变量
2020/06/01 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
Java语言的优势
2015/01/10 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
大学生学习党课思想汇报
2014/01/03 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
学校大课间活动方案
2014/01/30 职场文书
《青山不老》教学反思
2016/02/22 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
python实现MD5进行文件去重的示例代码
2021/07/09 Python
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
Python实现对齐打印 format函数的用法
2022/04/28 Python