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

发布时间 - 2026-01-10 22:50:25    点击率:

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

首先上个例子:

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);

如果像上面那样使用超时调用,则可以避免这一点。所以不要使用间歇调用;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 递归  # 定时器  # js定时器实现倒计时效果  # JavaScript定时器详解及实例  # JavaScript暂停和继续定时器的实现方法  # JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)  # JavaScript定时器setTimeout()和setInterval()详解  # Javascript 定时器调用传递参数的方法  # js 定时器setTimeout无法调用局部变量的解决办法  # js定时器+简单的动画效果实例  # JS动画定时器知识总结  # JavaScript定时器设置、使用与倒计时案例详解  # 是一个  # 是在  # 模式下  # 情况下  # 就会  # 是一种  # 则是  # 可以用  # 但他  # 这是一个  # 只剩下  # 报错  # 先把  # 则可  # 上个  # 设置为  # 在前  # 来实现  # 每隔 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何彻底删除建站之星生成的Banner?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  公司网站制作价格怎么算,公司办个官网需要多少钱?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何在阿里云虚拟服务器快速搭建网站?  如何在局域网内绑定自建网站域名?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel如何使用Telescope进行调试?(安装和使用教程)  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何快速重置建站主机并恢复默认配置?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  制作公司内部网站有哪些,内网如何建网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何在阿里云域名上完成建站全流程?  如何在阿里云高效完成企业建站全流程?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  jQuery中的100个技巧汇总  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  JavaScript实现Fly Bird小游戏  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel中的Facade(门面)到底是什么原理  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  重庆市网站制作公司,重庆招聘网站哪个好?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何自定义错误页面(404, 500)?(代码示例)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何优化应用性能?(缓存和优化命令)  Laravel如何使用Blade模板引擎?(完整语法和示例)  如何正确选择百度移动适配建站域名?  如何确认建站备案号应放置的具体位置?  高端企业智能建站程序:SEO优化与响应式模板定制开发  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  再谈Python中的字符串与字符编码(推荐)