1. 程式人生 > >函數內部屬性之arguments和this

函數內部屬性之arguments和this

callee arguments 環境 argument else 轉換成 正常 一個 轉換

在函數內部,有兩個特殊的對象:arguments和this。

1、arguments

  arguments是一個類數組對象。包含著傳入函數中的所有參數。但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。

  經典案例:階乘函數

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

定義階乘函數一般都要用到遞歸算法,如上所示,但你會發現,這個函數的執行與函數名factorial緊緊耦合在了一起,為解決這個問題,我們可以使用arguments.callee。

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

我們重寫之後,factorial()函數裏沒有引用函數名factorial。這樣無論引用函數時使用的是什麽名字,都可以保證正常完成遞歸調用。例如:

var trueFac = factorial;

factorial = function(){
    return 0;
}

console.log(trueFac(5));  // 120
console.log(factorial(5)); // 0

2、this

函數內部的另一個對象是this,this引用的是函數執行的環境對象(當在網頁的全局作用域中調用函數時,this對象引用的就是window)。

window.color = "red";
var o = { color: "blue" };

function sayColor(){
    alert(this.color);
}

sayColor(); // "red"

o.sayColor = sayColor;
o.sayColor(); // "blue"

在上面這個函數sayColor()是在全局作用域中定義的,它引用了this對象。由於在調用函數之前,this的值並不確定,因此this可能會在代碼執行過程中引用不同的對象。

當在全局作用域中調用sayColor()時,this引用的時全局對象window;換句話說,對this.color求值會轉換成對window.color求值,於是結果就返回了"red"。而當把這個函數賦給對象o並調用o.sayColor()時,this引用的是對象o,因此對this.color求值會轉換成對o.color求值,所以返回“blue”。

函數的名字僅僅是一個包含指針的變量。

函數內部屬性之arguments和this