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 相关文章推荐
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
Mar 10 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
Nov 27 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
JS实现支持Ajax验证的表单插件
Mar 24 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
Javascript小技能总结(推荐)
Jun 02 Javascript
用JavaScript做简易的购物车的代码示例
Oct 20 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php的4种常用运行方式详解
2016/12/22 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
Django实现基于类的分页功能
2019/10/31 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
秋季运动会稿件
2014/01/30 职场文书
个人公开承诺书
2014/03/28 职场文书
房产分割协议书范文
2014/11/21 职场文书
防汛通知
2015/04/25 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL