Корректный рекурсивный вызов функции, с защитой от изменения её имени

function factorial(x) {
    return x == 1 ? 1 : x + arguments.callee(x - 1);
}
var fac = factorial;
factorial = 27;
alert(fac(factorial)); // Возвращает “378″.

// ---------------------------------------------------

var factorial = function f(x) {
    return x == 1 ? 1 : x + f(x - 1);
};

alert(f); // Ошибка: “f is not defined”

Получить колличество аргументов, которые объявлены в описании функции

function one   (foo) {};
function three (foo, bar, qux) {};

console.log(  one.length); // 1
console.log(three.length); // 3
-----------