callee、caller、this在function中的作用

Function中有两个属性,arguments与this会比较常用到。

一、arguments

arguments只能在函数中使用,首先我们将arguments弹出来看一下。

function fn(){
  console.log(arguments);
}

在chrome的控制台中弹出来看看


发现arguments是一个数组形式的,但到底是不是数组,接着看。

function fn(){
  console.log(typeof arguments);//加typeof判断类型
}

发现arguments不是数组而是一个对象,只是它长的像一个数组。可以看到arguments中有一个callee属性,它指向该函数本身。下面来看一下应用。

1.定义函数

//最简单的阶乘函数
function fn(num){
    if( num<=1 ) return 1;
    else return num * fn(num-1);
} 
//执行
fn(10)  //返回3628800

但是函数体中,函数的执行与函数名fn 紧密的耦合在一起,比如let foo = fn; 执行foo();函数是不能正常工作的。为了消除这种紧密的耦合,使函数更加纯方法,就用到了callee

2.改写函数fn()

function fn(num){
    if( num<=1 ) return 1;
    //else return num * fn(num-1);
    else return num * arguments.callee(num-1);
   //将原来的fn()用  arguments.callee来代替,解耦了与函数名的依赖
}

还有一个属性,arguments.callee.caller顾名思义caller就是函数的调用者是谁,写一个例子就明白了。

function outer(){
    inner();
}
function inner(){
    alert(arguments.callee.caller);
}
// 执行
outer();  //弹出function outer(){...}
//指向调用者outer;

二、this

在JavaScript中this是动态的,运行时决定this指针指向谁。如果函数在全局作用域下执行,this就指向window或global,所以this是指向函数当前执行环境下的所有者。

你可能感兴趣的:(callee、caller、this在function中的作用)