函数内部有2个特殊对象: arguments 、 this
1、arguments 是一个类数组对象,包含传入函数中的所有参数,虽然它的主要用途是保存函数参数,但这个对象还有一个名叫 callee 的属性。
这个属性是一个指针,指向拥有这个 arguments 对象的函数:
这是一个非常经典的阶乘函数。定义阶乘函数一般用到递归算法。
但问题是这个函数的执行与函数名 factorial 紧紧耦合在了一起,如果过改变了函数名,势必要改变内部的递归调用。
为了消除这种紧密耦合现象,可以使用 callee :
2、另一个特殊对象是 this,引用的是函数据以执行的环境对象。
函数 showColor() 是在全局中定义的,所以当在全局作用域中调用该函数时,this 引用的是全局对象 window,也就是对 this.color 求值会转换成对 window.color 求值,于是结果为 red 。
而把这个函数赋值给对象 o ,并调用函数, this 引用的是对象 o,因此对 this.color 求值会转换成对 o.color 求值,返回 blue。
3、ECMAScript 5 也规范了另一个函数对象的属性:caller。
这个属性中保存这调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为 null。
因为 outer() 调用了 inner(),所以 inner.caller 就指向了 outer()。
但要注意,在严格模式下,访问这些属性会报错
不过也可以使用命名函数表达式来取得相同的结果: