amandakelake/blog

函数的内部属性和方法(arguments、callee)

amandakelake opened this issue · 0 comments

函数内部属性和方法(arguments、this)

#前端/Javascript/个人理解总结

每个函数都是Function类的对象,而且都与其他引用类型一样具有属性和方法
由于函数是对象,所以函数名实际上也只是一个指向函数对象的指针而已;

所以使用不带圆括号的函数名是访问函数指针,而非调用函数

函数内部有两个特殊的对象
argumentsthis
每个函数都包含两个属性
lengthprototype
每个函数都包含两个非继承而来的方法
callapply

arguments

Arguments是一个类数组对象,包含着所有传入函数中的形参,它还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数,也就是代指函数本身

先看一个递归函数(阶乘)

function factorial(num) {
  if (num <= 1) {
    return 1
  } else {
    return num * factorial(num-1)
  }
}

但函数的执行与函数名factorial紧紧的联系在了一起

比如说,由于factorial被绑定,func1()返回的就是0

var func1 = factorial;
func1()

那么,如何解耦,就要用到callee

function factorial(num) {
  if (num <= 1) {
    return 1
  } else {
    return num * arguments.callee(num-1)
  }
}

这样就完成了函数体代码与函数名的耦合

this
length

表示函数希望接收的命名参数的个数

prototype

不可枚举,用for-in无法发现

call和apply

设置函数体内this对象的值