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 相关文章推荐
Javascript中的数学函数集合
May 08 Javascript
JavaScript 学习笔记一些小技巧
Mar 28 Javascript
open 动态修改img的onclick事件示例代码
Nov 13 Javascript
js中replace的用法总结
Dec 27 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
May 13 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
Feb 26 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
深入理解Javascript中的观察者模式
Feb 20 Javascript
VUE中v-model和v-for指令详解
Jun 23 Javascript
使用vux实现上拉刷新功能遇到的坑
Feb 08 Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 Javascript
小程序实现多个选项卡切换
Jun 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中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
PHP会话控制实例分析
2016/12/24 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
python剪切视频与合并视频的实现
2020/03/03 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
学前班评语大全
2014/05/04 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
寻找成龙观后感
2015/06/12 职场文书
教师培训简讯
2015/07/20 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL