1. 程式人生 > >function中的callee和caller

function中的callee和caller

在函式內部,arguments是一個類陣列物件,用於儲存函式引數。

這次主要簡述一下arguments內部存在的2個屬性:calleecaller

callee:

callee:是一個指標,指向擁有這個arguments物件的函式,

例子:

function cool(){
    console.log(arguments.callee);
}

cool();

//結果打印出來(chrome下):
ƒ cool(){
 console.log(arguments.callee);
}

利用callee指標的特性,我們可以用來做階乘之類的邏輯處理:

下面是最基本常見的階乘,

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

add(10);    //3628800

上面的階乘有個最大的問題就是,函式內部的執行與函式名add耦合在一起,可以用arguments.callee來消除這種耦合:

function add(num) {
    if(num <= 1){
        return 1;
    }else{
        return num * arguments.callee(num-1
); } } add(10); //3628800

caller:

caller保留著呼叫當前函式函式的引用。

function add() {
    addChild();
}

function addChild() {
    console.log(addChild.caller);
}

add();

//在chrome下列印結果:
ƒ add() {
  addChild();
}

為了實現低耦合,可以用arguments.callee來實現:

function add() {
    addChild();
}

function addChild(argument)
{
console.log(arguments.callee.caller); } add(); //在chrome下列印結果: ƒ add() { addChild(); }

*如果是在全域性作用域下呼叫該函式,callernull

function add() {
    console.log(arguments.callee.caller);
}

add();      //null

注意:

  1. arguments.callee在嚴格模式下會導致錯誤;
  2. 不能為caller賦值,否則報錯;
  3. ECMAScript5還定義了arguments.caller ,嚴格模式下會導致錯誤,非嚴格模式下是undefined
  4. 定義arguments.callee是為了區分arguments.caller和函式的caller屬性。