数组中的动态函数参数

时间:2011-09-07 17:11:49

标签: javascript arrays arguments

有点难以找到合适的标题......

我有一个对象,它基本上是一个笛卡尔坐标数组(x,y值)的包装器。我现在正在该阵列上定义一些变换方法(移动,旋转,倾斜,镜像)。基本上所有这些方法都需要数组的迭代器,所以我写了一个函数iterate:

myList.prototype.iterate = function() {
    var fn = arguments[0];  // first argument is the actual transform function.
    ..

可选地,可以传入第二个参数,该参数必须是myList的实例。如果传入此参数,则函数将对参数的副本进行操作,否则它必须对其自身进行操作:

    if (arguments.length === 2 and arguments[2].type === this.type) {
        target = $.extend({}, arguments[2]); // deep copy.
    } else {
        target = this;
    }

到目前为止一直很好,现在我正在定义我的转换函数(旋转)

myList.prototype.rotate=function() {
    var rotatePoint = function (angle, pt) {
    return {x : (pt.x * Math.cos(angle) - pt.y* Math.sin(angle))
        , y : (pt.x * Math.sin(angle) + pt.y* Math.cos(angle)) };
    }
    if (arguments.length() === 1)  {    //Alternative for this if statement.
        return this.iterate(rotatePoint.curry(arguments[0]));
    } else {
        return this.iterate(rotatePoint.curry(arguments[0]),arguments[1]);
    }
}

curry是一个非标准的javascript函数,并描述为here。 if声明我不是很高兴。我认为通过申请或致电可以做得更优雅。但我无法弄清楚这一点。问题还在于迭代中的参数[2]将是一个空数组,在比较类型时拧紧我的if语句。

如何在一些漂亮干净的javascript代码中重写if语句,以便在iterate中没有传递时没有第二个参数;

1 个答案:

答案 0 :(得分:1)

做这样的工作吗?

var args = $.makeArray(arguments),
    iterator = rotatePoint.curry(args.shift());
args.unshift(iterator);
return this.iterate.apply(YOURTHIS, args);