使用Function.prototype.apply()中的apply()方法时出现问题。
我正在尝试使用apply()将参数数组传递给bezierCurveTo方法,从而在CreateJS舞台上创建一系列绘图。这将允许我遍历大约一百个这样的参数集并绘制完整的图片。
但是,apply()不能用于bezierCurveTo方法(它适用于moveTo和lineTo)。
相反,我得到了
TypeError: this.append is not a function
有没有人对这可能发生的原因有任何想法?我不清楚为什么它适用于其他方法而不是bezierCurveTo。
var myData = {
curveTo: [214.1, 853.1, 327.1, 903.7, 451.8, 903.7],
};
var sha = new createjs.Shape();
sha.graphics.bezierCurveTo.apply(myData.curveTo);
谢谢。
编辑:
堆栈跟踪显示错误所在:
p.moveTo = function(x, y) {
return this.append(new G.MoveTo(x,y), true);
};
答案 0 :(得分:1)
.apply
的第一个参数是上下文,即。回调中this
的值。
我认为正确的电话是:
sha.graphics.bezierCurveTo.apply(sha.graphics /* or maybe sha? */, myData.curveTo);
这相当于:
sha.graphic.berzierCurveTo(214.1, 853.1, 327.1, 903.7, 451.8, 903.7);
有关.apply
的更多信息:
var obj = {
"foo": "bar"
};
function get_foo() {
return this.foo;
}
get_foo.apply(obj, []); // "bar" first argument becomes `this` in callback
get_foo.bind(obj)(); // "bar" .bind() returns a copy of the function with bound context
答案 1 :(得分:0)
所以,我找到了这个问题的答案,并希望跟进。在我解决这个问题的过程中,他们向Halcyon提供了疯狂的道具指导。该问题似乎是库CreateJS将这些函数映射到标准Javascript画布方法的方式的组合。因为它正在创建新对象,所以apply操作符在这个实例中不起作用。
在这里阅读更多内容: Use of .apply() with 'new' operator. Is this possible?
长话短说,使用" new"无论你如何尝试设置上下文,operator,.apply()都不能作为一种方法将数组扩展为函数调用的一系列参数。