arguments 多半用來處理可變參數數量的情況。
function a(b, c) { return b + c; } console.log(a(2, 3)); // 5 function a() { var b = 0; for (var i=0; i<arguments.length; i++) { // 隱藏版屬性,憑空出現 b += arguments[i]; } return b; } console.log(a(2, 3)); // 5 console.log(a(2, 3, 4)); // 9 console.log(a(2, 3, 4, 5)); // 14arguments 除了可以用來讀取傳入 function 的參數外,還有一個特別的屬性,就是 callee。
官方定義 callee:指向目前正在執行的 function 物件。
var f = function() { return arguments.callee === f; }; console.log(f()); // truecallee 主要用於遞迴計算,尤其在匿名 function 裡執行遞迴呼叫時,callee 是唯一的方法 。
一般的遞迴作法。
function f(n) { if (n <= 1) { return 1; } return n * f(n - 1); } console.log(f(5)); // 120在無名 function 裡,因為無名所以無法直接呼叫以進行遞迴,這時候就可以用 arguments.callee。
var f = function(n) { if (n <= 1) { return 1; } return n * arguments.callee(n - 1); }; console.log(f(5));但是無名 function 裡還是可以用變數名稱來進行遞迴。
var f = function(n) { if (n <= 1) { return 1; } return n * f(n - 1); }; console.log(f(5));真正需要 callee 的是匿名 function 的遞迴。
function f(n, callback) { return callback(n); } console.log(f(5, function(n){ if (n <= 1) { return 1; } return n * arguments.callee(n - 1); // 沒有任何 function name 可以呼叫,唯有 arguments.callee }));但是在 ECMAScript 5 的 strict mode,callee 屬性在是禁止使用的。
---
---
---
沒有留言:
張貼留言