函数内部属性
在函数内部,有两个特殊的对象:arguments 和this。
arguments 的主要用途是保存函数参数,但这个对象还有一个名叫callee 的属性,该属性是一个指针,指向拥有这个arguments 对象的函数。
请看下面这个非常经典的阶乘函数:
javascript
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}
了消除这种紧密耦合的现象,可以像下面这样使用arguments.callee:
javascript
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
请读者一定要牢记,函数的名字仅仅是一个包含指针的变量而已。
ECMAScript 5 也规范化了另一个函数对象的属性:caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。
javascript
function outer() {
inner();
}
function inner() {
console.log(inner.caller);
}
outer(); //function outer(){inner()}
为了实现更松散的耦合,也可以通过arguments.callee.caller来访问相同的信息。
当函数在严格模式下运行时,访问arguments.caller 或 arguments.callee 会导致错误。