Javascript自定义应用功能

时间:2013-03-11 15:07:56

标签: javascript apply referenceerror

我正在和一位朋友建立一个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;
}());

2 个答案:

答案 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对象构造函数之外,不再抛出错误。这是一个范围问题。