Diciamo che ottengo una funzione anonima che è necessario agire sul suo contesto, ma è diverso se è associato a "finestra" oa un oggetto sconosciuto.Come ottenere il "questo" (scope) di una funzione anonima Javascript?
Come ottenere un riferimento all'oggetto da cui viene chiamata una funzione anonima?
EDIT, del codice:
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);
Si potrebbe legittimamente chiedere, perché il diavolo ti piacerebbe fare qualcosa di simile. Beh, per prima cosa ho voluto disfare gli argomenti passati come array. Proprio come il Python operatore "*
" fa:
>>> args = [1,2,3]
>>> def foo(a,b,c) :
print a,b,c
>>> foo(*args)
1 2 3
ho scavato nel SO e trovato un post dice di usare "apply()":
function bar(callback, args){
this[callback].apply(this, args);
}
interessante dal momento che è intenzione di utilizzare l'attuale " questo "se in un oggetto, e" finestra "se non.
ma penso che ci sia un problema:
se "bar()" è di per sé in un oggetto, quindi "questo" si riferiscono alla "barra()" contenitore, Perciò non funzionerà.
BTW, Mi piacerebbe non passare l'oscilloscopio come parametro.
Posso ovviamente concatenare gli argomenti e la funzione come stringa, quindi utilizzare eval, ma mi piacerebbe usarlo solo se non riesco a trovare qualcosa di più pulito.
Naturalmente, se è solo impossibile (dopo tutto, potrebbe essere), allora farò:
function foo(func, args)
{
eval("func("+args.join(", ")+");");
}
EDIT 2: pieno scenario, come ha chiesto nei commenti.
Sto usando qunit per eseguire test di unità in Javascript. È bello, ma mi manca un modo per verificare se qualcosa solleva un'eccezione.
Il test più semplice è fatto in questo modo:
/**
* Asserts true.
* @example ok($("a").size() > 5, "There must be at least 5 anchors");
*/
function ok(a, msg) {
_config.Test.push([ !!a, msg ]);
}
L'idea è di fare qualcosa di simile:
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 ]);
}
};
Se ho potuto sbarazzarsi di eval, sarebbe bello. E perché non voglio usare l'oscilloscopio come parametro? Perché potresti voler fare un ciclo su un contenitore facendo riferimento a 20 funzioni con diversi ambiti e testarli tutti nel ciclo invece di scrivere a mano le cose.
Potrebbe fornire qualche esempio di codice? Ho qualche difficoltà a capire cosa vuoi veramente. –
Sì, non sono sicuro di cosa stiate cercando. Si prega di fornire un esempio di codice. – SolutionYogi
Hai ragione, fatto. –