私は無名関数にそのコンテキストで動作する必要があるとしましょうが、それが「ウィンドウ」にバインドされているのか、それとも未知のオブジェクトであるのかは異なります。Javascriptの無名関数の「this」(スコープ)を取得するには?
匿名関数が呼び出されたオブジェクトへの参照を取得するにはどうすればよいですか?
EDIT、いくつかのコード:
var ObjectFromOtherLibIAmNotSupposedToknowAbout = {
foo : function() {
// do something on "this"
}
}
var function bar(callback) {
// here I want to get a reference to
// ObjectFromOtherLibIAmNotSupposedToknowAbout
// if ObjectFromOtherLibIAmNotSupposedToknowAbout.foo is passed
// as callback
}
bar(ObjectFromOtherLibIAmNotSupposedToknowAbout.foo);
あなたは合法的に、なぜ一体あなたがそのような何かをしたいん、頼むかもしれません。さて、私は最初に渡された引数を配列として解凍したかったのです。ただ、Pythonのように「*
」演算子はありません:
>>> args = [1,2,3]
>>> def foo(a,b,c) :
print a,b,c
>>> foo(*args)
1 2 3
は、私がSOに掘って「)(適用」を使用するように指示postが見つかりました:「電流を使用するように起こっているので、
function bar(callback, args){
this[callback].apply(this, args);
}
興味深いですこれがオブジェクト内にあれば "this"、そうでなければ "window"になります。
しかし、私は問題があると思う:
場合「(バー)」、それは動作しません、そのため、その後、「これは」、「バー()」コンテナを参照すると、オブジェクト自体です。
BTW、私はパラメーターとしてスコープを渡したくありません。
もちろん、引数と関数を文字列として連結してevalを使用することはできますが、私は何かクリーナーが見つからない場合にのみこれを使用したいと思います。もちろん
、それは(結局、それができる)だけでは不可能だ場合、その後、私はやります:
function foo(func, args)
{
eval("func("+args.join(", ")+");");
}
EDIT 2:フルシナリオ、コメントで尋ねたよう。
私はqunitを使ってJavascriptでユニットテストを行っています。クールですが、例外が発生するかどうかを確認する方法がありません。
最も基本的なテストは、そのように行われます:アイデアはのようなものを作ることです
/**
* Asserts true.
* @example ok($("a").size() > 5, "There must be at least 5 anchors");
*/
function ok(a, msg) {
_config.Test.push([ !!a, msg ]);
}
:私はevalを取り除くことができれば
jqUnit.prototype.error = function(func, args, msg)
{
try
{
eval("func("+args.join(", ")+");");
config.Test.push([ false, msg + " expected : this call should have raised an Exception" ]);
} catch(ex)
{
_config.Test.push([ true, msg ]);
}
};
、それは素晴らしいことです。なぜ私はスコープをパラメータとして使用したくないのですか?異なるスコープを持つ20個の関数を参照しているコンテナをループして、手作業で記述するのではなくループ内ですべてテストする必要があるかもしれないからです。
いくつかのコード例を教えてください。私はあなたが本当に欲しいものを理解するのにいくつかの困難を持っています –
はい、あなたが探しているものがわかりません。いくつかのコードサンプルを提供してください。 – SolutionYogi
あなたは正しいと思います。 –