5

私はかなり頻繁にバインドする必要がありますか?引数を必要とする関数。私が使用する解決策は、バインドする関数を無名関数内にラップすることです。

function foo( arg_0 ) {
   // do stuff with: arg_0
}

function bar() {
   var abc;
   // stuff happens
   abc = 'some value';
   attachEventHandler(elementId, 'click', function(){foo( abc );});
}
bar();

これを行うよりエレガントな方法はありますか?

4

5 に答える 5

10

次のようにカレーを作ることができます。

function curry(func) {
    var functionArgs = Array.prototype.slice.call(arguments, 1);
    return function() { return func.apply(this, functionArgs); };
}

使用法:

attachEventHandler(elementId, 'click', curry(foo, abc) );

または:

Function.prototype.curry = function() {
    var func = this, functionArgs = arguments;
    return function() { return func.apply(this, functionArgs); };
}

使用法:

attachEventHandler(elementId, 'click', foo.curry(abc) );
于 2010-02-10T16:15:38.563 に答える
1

「カレー」を好む場合は関数という単語を非表示にすることができますが、元のメソッドはオーバーヘッドなしで同じことを行います。

無名関数の括弧内の引数は必要ありません-定義してもスコープ内にあります-

abc = 'some value';
attachEventHandler(elementId, 'click', function( abc ){foo( abc );})
could be:
attachEventHandler(elementId, 'click', function(){foo(abc)});
于 2010-02-10T16:51:16.587 に答える
1

それはいいです。あなたが持っているのは、本質的にコールバックまたは「デリゲート」の使用です。

スクリプト内でこれを頻繁に行う必要がある場合、SLaks のカリー化ツールは便利な構文糖衣です。

于 2010-02-10T16:23:20.493 に答える
0

あなたのコードには、引数としてイベントを取る関数foo()がありますか? それだけの場合は、attachEventHandler()を次のように記述できます。

attachEventHandler(elementId, 'click', foo);

そこで何が起こっているかというと、 foo() を呼び出す代わりに、 foo()への参照を渡しているということです。

これはあなたが考えていることに近いですか?

于 2010-02-10T16:29:43.703 に答える
-2

いくつかのjsライブラリを見たいと思うかもしれません

例えばゆい

あなたがすること

YUI().use('node',function(Y){
  Y.one("#elementID").on('click', function(){
    // do your stuff here
  });
});
于 2010-02-10T16:22:49.767 に答える