JavaScript 对象属性作实参以及实参对象的callee属性

参考自<<JavaScript权威指南 第6版>>

/*
 * 将对象属性用作实参, 从而不必记住参数的顺序.
 */
function arraycopy(from,from_start,to,to_start,length){
    for(var i=from_start,j=to_start;i<from_start+length;++i,++j){
        to[j] = from[i];
    }
}
function easycopy(args){
    arraycopy(args.from,
        args.from_start || 0, //default param
        args.to,
        args.to_start || 0,
        args.length);
}
var a = [1,2,3,4],b = [];
easycopy({from:a,to:b,length:4});
console.log(b); // [ 1, 2, 3, 4 ]

/*
 * arguments对象有 callee 和 caller属性, 在非严格模式下,
 * callee: 指代当前正在执行的函数, 非标准的属性,但是大多数浏览器都已经实现了. 在匿名函数的递归调用中很有用.
 * caller: 可以访问调用栈
 */
var fact = function(x){
    if(x <= 1)
        return 1;
    return x * arguments.callee(x-1);
}
// 这样也是可以的
var fact2 = function(x){
    if(x <= 1)
        return 1;
    return x * fact2(x-1);
}
console.log(fact(5)); // 120
console.log(fact2(5)); // 120

/* 代码自文档化, 因为js没有参数类型, 所以最好加参数注释或者取有意义的名字,如下:
 * number表示参数是数字类型的
 * ... 表示数量不限.
 */
function max(/*number...*/){};
原文地址:https://www.cnblogs.com/roger9567/p/5039192.html