js 函数的内部属性

  函数内部有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()。

  但要注意,在严格模式下,访问这些属性会报错

  不过也可以使用命名函数表达式来取得相同的结果:

原文地址:https://www.cnblogs.com/guofan/p/14516437.html