- 一、JavaScript简介
- 1.1 JavaScript 简介
- 1.2 开发环境
- 二、基本语法
- 2.1 语法
- 2.2 数据类型
- 2.3 变量
- 2.4 表达式和运算符
- 2.5 语句
- 三、BOM
- 3.1 windows 对象
- 3.2 location 对象
- 3.3 history对象
- 3.4 screen对象
- 四、DOM
- 4.1 节点NodeType属性
- 4.2 获取节点
- 4.3 节点操作
- 4.4 属性操作
- 4.5 操作表格
- 五、事件
- 5.1 事件流
- 5.2 文档加载事件
- 5.3 事件类型
- 六、函数
- 6.1 函数基本用法
- 6.2 递归函数
- 6.3 闭包函数
- 七、面向对象
- 7.1 理解对象
- 7.2 原型和原型链
- 7.3 设计模式
- 八、错误与调试
- 8.1 错误处理与调试
- 九、进阶知识
- 9.1 表单处理
- 9.2 Cookie和存储
- 9.3 定时器
- 9.4 Ajax
- 9.5 Json
- 9.6 代码规范
6.2 递归函数
递归函数是在一个函数通过名字调用自身的情况下构成的。
例如:
<xmp>
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * factorial(num-1)
}
}
</xmp>
这是一个经典的递归阶乘函数。虽然这个函数表面看没什么问题,但以下操作会报错
<xmp>
var fn = factorial;
factorial = null;
fn(4); //出错
</xmp>
代码解析:先把factorial函数保存在变量 fn中,然后将factorial设置为null,结果指向原始函数的引用只剩下一个。再调用fn时,必须执行factorial,而factorial不再是函数,而是null,所以会报错。
在这种情况下使用 arguments.callee可以解决这个问题,arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现函数的递归:
<xmp>
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num-1)
}
}
</xmp>
但在严格模式下,不能通过脚本访问arguments.callee, 会导致报错。此时可以使用命名函数表达式达成相同的结果:
<xmp>
var factorial = function(function f(num){
if(num <= 1){
return 1;
} else {
return num * f(num-1)
}
});
</xmp>
上一篇:6.1 函数基本用法
下一篇:6.3 闭包函数
评论
共0 条评论
没有更多了..