js 递归和定时器的实例解析

 更新时间:2017年02月03日 16:28:22   作者:单先生  
本文主要介绍了js递归和定时器的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧

递归:是一个函数通过调用自身的情况下构成的;

首先上个例子:

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 DIV实现跟随鼠标移动

    javascript DIV实现跟随鼠标移动

    这篇文章主要为大家详细介绍了javascript DIV跟随鼠标移动,有一个div跟随鼠标移动的结果,有一连串跟随鼠标移动的效果,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • js事件冒泡实例分享(已测试)

    js事件冒泡实例分享(已测试)

    js事件冒泡实例:摘的网上的例子,但是他写的有错误,自己改正了下,已验证通过,感兴趣的朋友可以参考下哈
    2013-04-04
  • JavaScript的数据类型转换原则(干货)

    JavaScript的数据类型转换原则(干货)

    JavaScript是一门弱类型(或称动态类型)的语言,即变量的类型是不确定的。下面通过本文给大家分享javascript数据类型转换小结,包括显示转换的数据类型和隐式的数据类型转换,感兴趣的朋友跟随脚本一起看看吧
    2018-03-03
  • ES6 Iterator接口和for...of循环用法分析

    ES6 Iterator接口和for...of循环用法分析

    这篇文章主要介绍了ES6 Iterator接口和for...of循环用法,结合实例形式分析了Iterator接口和for...of循环相关使用技巧,需要的朋友可以参考下
    2019-07-07
  • javascript事件问题

    javascript事件问题

    咱们都知道,在DOM事件模型中,有捕获和冒泡两个阶段,而在IE事件模型中,只有冒泡阶段。写在html里的事件响应函数只有在冒泡阶段才会被执行
    2009-09-09
  • JavaScript 高效运行代码分析

    JavaScript 高效运行代码分析

    传统上,网页中不会有大量的脚本,至少脚本很少会影响网页的性能。
    2010-03-03
  • JavaScript自定义函数实现查找两个字符串最长公共子串的方法

    JavaScript自定义函数实现查找两个字符串最长公共子串的方法

    这篇文章主要介绍了JavaScript自定义函数实现查找两个字符串最长公共子串的方法,涉及javascript针对字符串的遍历、比较、查找等相关操作技巧,需要的朋友可以参考下
    2016-11-11
  • JavaScript删除数组中指定元素5种方法例子

    JavaScript删除数组中指定元素5种方法例子

    这篇文章主要给大家介绍了关于JavaScript删除数组中指定元素5种方法,在最近的项目中,有用到js对数组的操作,所以这里总结一下,需要的朋友可以参考下
    2023-07-07
  • 移动端JS实现拖拽两种方法解析

    移动端JS实现拖拽两种方法解析

    这篇文章主要介绍了移动端JS实现拖拽两种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 深入理解JavaScript系列(11) 执行上下文(Execution Contexts)

    深入理解JavaScript系列(11) 执行上下文(Execution Contexts)

    本章我们要讲解的是ECMAScript标准里的执行上下文和相关可执行代码的各种类型
    2012-01-01

最新评论