2011-07-26 14 views
0

私は、別のコンテキストで関数を呼び出すことができるヘルパー関数を持っています。それはかなり簡単です:私は、関数の実行時の変数を評価するwan'tが、時々私は、建設時に固定されているデリゲート関数値を与えたい場合は代理人 - 構築/実行-Time-Parameter

function delegate(that, thatMethod) 
{ 
    return function() { return thatMethod.apply(that,arguments); } 
} 

これはokです。
サンプル:

var callbacks = new Array(); 
for(var i = 0; i < 5; i++) 
{ 
    callbacks.push(delegate(window, function() { alert(i) })); 
} 
callbacks[3](); 

この場合は、私の期待される動作は、私は警報(3)を得ることであるが、ので、我々にはない、実行時に評価されます。私が知っている
のようなものに見える別のデリゲートの機能があります:

function delegatedd(that, thatMethod) 
{ 
    if(arguments.length > 2) 
    { 
     var _params = []; 
     for(var n = 2; n < arguments.length; ++n) 
      _params.push(arguments[n]); 
     return function() { return thatMethod.apply(that,_params); } 
    } 
    else 
     return function() { return thatMethod.call(that); } 
} 

をしかし、私は両方の方法をミックスしたいので、それはどちらか私を助けていません。これは、(使用デリゲートの最初のバージョン)そのように書くことができます:

function(foo) { 
    return delegate(window, function() { 
     alert(foo); 
    }); 
}(i) 

ので私は施工時間と他のすべての実行時間です。
これの欠点は、それがかなり醜いように見えるということです。それを行うより良い方法はありますか?どういうわけかそれを関数で隠すことはできますか?

おかげ

答えて

1

あなたはバインド機能を使用することができます。

var callbacks = new Array(); 
for(var i = 0; i < 5; i++) 
{ 
    //callbacks.push(delegate(window, function() { alert(i) })); 
    callbacks.push(function(n) { alert(n) }.bind(window, i); 
} 
callbacks[3](); 

しかし、どのように、それはhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Compatibilityを参照してくださいIEで仕事を得るために、バインドは、(IE9のことは知らない)IE上で実装されていません。

関連する問題