我正在和一位朋友建立一个javascript库,这个朋友应该让HTML5游戏创建更容易(但这真的只是为了好玩)而且这里有一些我遇到问题的代码:
/* Calls f on all the elems of the list that pass p and implement f */
var apply = function (f, p, list) {
for (var i in list) {
if (p(list[i]) === true && list[i][f] != undefined && typeof list[i][f] === 'function') {
list[i][f]();
}
}
};
this.draw = function(p) {
apply(moveView, p, this.views);
};
用户将调用this.draw函数并将谓词传递给它。传递给apply函数的函数moveView只有在views数组中的每个对象都实现它时才会被执行。
然而,我的控制台抛出一个错误,说“moveView未定义”,这是有道理的,因为。在我调用我的apply函数时,我不希望解释器检查moveView是否存在,我只是想传递它,所以我可以检查是否正在应用的每个对象,实现该函数。我认为可能调用像apply("draw", p, this.views);
这样的应用程序可以工作,但这并不是因为然后在apply函数中,f不再是一个函数,它是一个字符串。我真的只想将任何通用函数名称传递给我的apply函数,以便我可以在那里进行所有检查。
我的所有代码都可以在Github上找到。
编辑:
/*View object*/
var View = (function(){
var constr = function(f, o, i){
this.frame = utility.checkFrame(f);
this.orient = utility.checkOrientation(o);
/*user identification string*/
this.id = i;
this.moveView = function(){
console.log("testing");
};
};
return constr;
}());
答案 0 :(得分:0)
如果在调用apply()
时您的功能不存在,则在您检查功能的对象上也不存在该功能。
此外,如果f
是您的函数参数,则list[i].f
不会评估为list[i].yourFunction
。它始终是list[i].f
。您需要检查list[i][f]
。
答案 1 :(得分:0)
我明白了。它在我的View对象中:
var View = (function(){
this.moveView = function(){
console.log("testing");
};
var constr = function(f, o, i){
this.frame = utility.checkFrame(f);
this.orient = utility.checkOrientation(o);
/*user identification string*/
this.id = i;
};
return constr;
}());
我将moveView移到View对象构造函数之外,不再抛出错误。这是一个范围问题。