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是指向函數當前執行環境下的所有者。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容