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);
如果像上面那样使用超时调用,则可以避免这一点。所以不要使用间歇调用;
更多js 递归和定时器的实例解析相关文章请关注PHP中文网!
上一篇: JS 在方法细节上递归删除数组元素
推荐阅读
-
机器学习]聚类算法|KMeans 实现过程|SSE 误差均衡法和 SC 轮廓系数法|客户数据聚类分析示例
-
特征工程和选择:优化模型性能的关键步骤 ---- 示例:泰坦尼克号生存预测中的特征工程,使用递归特征消除 (RFE) 进行特征选择
-
JS加密和混淆的原因以及如何对其进行逆向分析
-
使用Vue和D3.js搭建交互式流向图(桑基图)示例
-
使用SQL(DBMS):普遍的编程方法连接数据库,玩转函数与过程、触发器、递归查询,掌握高级聚合特性和OLAP分析
-
打造一个HTML、CSS和JS构建的静态网页(附带完整代码示例)
-
用HTML、SCSS和JS实现实用的登录与注册功能示例代码
-
JS 原型链详细说明和示例代码
-
AST 语法树 python ast 语法树解析 - 首先,让我们了解一下 AST 的基本理论? 抽象语法树(AST)或简称语法树(SST)是源代码语法结构的抽象表示。它以树的形式表示编程语言的语法结构,树中的每个节点代表源代码中的一个结构。 与抽象语法树相对的是具体语法树(通常称为分析树)。一般来说,在翻译和编译源代码的过程中,语法分析器会创建分析树。创建 AST 后,在后续处理过程中(如语义分析阶段)会添加一些信息。 可以这样理解,语法树是作为 JavaScript 的编译器或解释器使用的,编译后的 JS 才能真正转换成计算机可识别的机器代码,并最终成功运行。 具体语法树是编译后记录所有细节的树结构,抽象语法树则是具体语法树的简化版,那么相对来说,抽象语法树的运行速度要快得多,比如 ESLint、Webpack 等工具都是使用 AST 来提高性能的,同时,AST 也足以满足这些工具运行时所需的信息。 让我们来看看抽象语法树的结构,举例说明
-
js 常规分析案例 - 以 JSON 格式校验和为例