0

コールバック関数をプライベート名前空間に記述し、参照によって呼び出すのが好きです。例えば

var myCallback = function() {

};

// ... somewhere else in the class.
SomeOtherObject.doSomething(myCallback);

これにより、コードがより整然とし、より拡張可能になります。ただし、元の関数からコールバックにパラメーターを渡す必要がある場合は、面倒になり、コールバック参照をクロージャーで囲む必要があります。例えば

var myCallback = function(a_var, another_var) {

};

// ... somewhere else in the class.
a_var = "something";
SomeOtherObject.doSomething(function(another_var) {
    myCallback(a_var, another_var);
};

これにより、コールバックで 1 回ではなく 2 回の関数呼び出しが必要になり、オーバーヘッドが生じます。それはまた、クロージャー用に文書化されていない匿名関数があること、または両方の関数を文書化していることも意味します。(パラメーター定義ほど面倒なのは、関数定義の欠落ではありません。) コールバックが小さい場合 (優れた関数と同様)、それをプライベート スコープに置く価値がないように思われます。

これを行う最善の方法は何ですか?

4

3 に答える 3

2

部分的なアプリケーションの実装では、この方法で変数を渡すことができます。

たとえば、ネイティブES5 を使用すると、次のbindようになります。

SomeOtherObject.doSomething( myCallback.bind(null, a_var) );

another_var呼び出されたときにその関数に渡されます

ただし、どこでもサポートされているわけではないため、アンダースコアから取得して代わりに使用できます。

于 2012-08-30T07:45:34.373 に答える
1

関数カリー化を行うことができます。

Function.prototype.curry = function() {
    if (arguments.length<1) {
        return this;
    }
    var __method = this;
    var slice = [].slice;
    var args = slice.call(arguments);
    return function() {
        return __method.apply(this, args.concat(slice.call(arguments)));
    }
}

それから

var a_var = "something";
SomeOtherObject.doSomething(myCallback.curry(a_var));
于 2012-08-30T07:45:36.127 に答える
1

あなたはカレーについて話している。実際、ES5Function.prototype.bindを使用して次のように実現できます。

var myCallback = function(a_var, another_var) {
};

SomeOtherObject.doSomething(myCallback.bind(null, a_var, another_var);

そこで何が起こるかと.bind()いうと、引数を取り、新しい関数を作成して、新しいスコープと変数でそれを返します。に渡される可能性のある他の引数doSomethingは、そのバインドされたリストの最後に表示されます。

使用上の注意点.bind()は性能です。なんらかの理由で(これまでのところわかりませんでした)、迷惑なほど遅いです。毎秒数十万回の操作について話しているため、アプリケーションではそれほど重要ではありませんが、通常の関数と比較すると、バインドされた関数呼び出しは約 60 ~ 90% 遅くなります。

于 2012-08-30T07:45:41.510 に答える