在函數內部,有兩個特殊的對象:arguments和this。 1、arguments arguments是一個類數組對象。包含著傳入函數中的所有參數。但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。 經典案例:階乘函數 定義階乘函數一般都要用到遞 ...
在函數內部,有兩個特殊的對象: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”。
函數的名字僅僅是一個包含指針的變數。