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 相关文章推荐
共享自己写一个框架DreamScript
Jan 20 Javascript
JQuery 写的个性导航菜单
Dec 24 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
js字符串操作方法实例分析
May 06 Javascript
jQuery实现的网页竖向菜单效果代码
Aug 26 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
Nov 11 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
js实现三角形粒子运动
Sep 22 Javascript
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 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
php 获取可变函数参数的函数
2009/08/26 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python多进程机制实例详解
2015/07/02 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python序列类型的打包和解包实例
2019/12/21 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
计算机求职信
2013/12/01 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
超市国庆节促销方案
2014/02/20 职场文书
程序员求职信
2014/04/16 职场文书
财务情况说明书范文
2014/05/06 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
教师远程研修感悟
2015/11/18 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP