1

HTML5ゲームの作成を簡単にするはずの友達とJavaScriptライブラリを構築しています(ただし、これは本当に楽しみのためです)。問題が発生しているコードは次のとおりです。

/* 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 likeを呼び出すとうまくいくと思い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;
}());
4

2 に答える 2

0

が呼び出されたときに関数が存在しない場合apply()は、関数をチェックするオブジェクトにも存在しません。

また、fが関数パラメータの場合、list[i].fは評価されませんlist[i].yourFunction。常にになりますlist[i].f。を確認する必要がありますlist[i][f]

于 2013-03-11T15:14:27.337 に答える
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オブジェクトコンストラクターの外に移動しましたが、エラーはスローされなくなりました。それは範囲の問題でした。

于 2013-03-11T15:23:42.247 に答える