比方說,我得到一個匿名函數的需要作用於它的上下文,但無論是綁定到「窗口」或不明物體是不同的。如何獲得Javascript匿名函數的「this」(範圍)?
我如何獲得一個匿名函數被調用的對象的引用?
編輯,一些代碼:
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);
}
有趣,因爲它會使用當前「這個「如果在一個對象中,而」窗口「如果不是。
但我覺得有一個問題:
如果「欄()」本身就是一個對象,那麼「這」指的是「扎()」的容器,爲此它不會工作。
順便說一句,我不想通過範圍作爲參數。
我當然可以級聯這些參數和函數作爲一個字符串,然後使用eval,但我想用這隻如果我不能找到更清潔。
當然,如果它只是不可能的(畢竟,它可能是),那麼我會做:
function foo(func, args)
{
eval("func("+args.join(", ")+");");
}
編輯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 ]);
}
的想法是讓這樣的:
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 ]);
}
};
如果我能擺脫的EVAL,這將是巨大的。爲什麼我不想將範圍用作參數?因爲您可能想要循環引用具有不同範圍的20個函數的容器,並在循環中測試它們,而不是手動編寫這些東西。
你能提供一些代碼示例嗎?我理解你真正想要的東西有些困難。 – 2009-10-11 14:13:40
是的,我不知道你在找什麼。請提供一些代碼示例。 – SolutionYogi 2009-10-11 14:15:09
你說得對,做完了。 – 2009-10-11 14:22:56