Ho una determinata funzione che accetta, tra gli altri argomenti, due argomenti facoltativi che possono essere funzioni. Entrambi devono essere facoltativi, uno sarà una funzione e uno sarà un booleano o una funzione che restituisce un valore booleano.Controllare se la funzione JavaScript ritorna senza eseguirla?
// Obj.func(variable, String[, Object][, Boolean||Function][, Function]);
Obj.func = function(other, assorted, args, BoolOrFunc, SecondFunc) {
// execution
};
Obj.func(
[
'some',
'data'
],
'of varying types',
{
and: 'some optional arguments'
},
function() {
if(some condition) {
return true;
}
return false;
},
function() {
// do things without returning
}
);
E 'mio desiderio che entrambe le funzioni (e diversi altri argomenti, se è importante) essere opzionale, che significa che devo codice nella funzione di determinare quali argomenti l'utente intendeva usare.
Sfortunatamente, poiché entrambe possono essere funzioni e possono essere specificate direttamente nella chiamata di funzione, non è possibile utilizzare semplicemente le condizioni typeof
o instanceof
. Tuttavia, dal momento che la prima funzione, se esiste, sarà sempre restituire un valore booleano (e la seconda funzione non tornerà affatto), un'idea che avevo sarebbe quello di controllare il suo valore di ritorno:
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function' && typeof BoolOrFunc() === 'boolean')) {
// BoolOrFunc is either a boolean or a function that returns a boolean.
// Handle it as the intended argument.
} else {
// Otherwise, assume value passed as BoolOrFunc is actually SecondFunc,
// and BoolOrFunc is undefined.
}
Questo funziona in linea di principio; tuttavia, l'esecuzione di typeof BoolOrFunc()
esegue la funzione, che causa un problema se la funzione fa più di un semplice ritorno booleano: ovvero se la funzione passata come BoolOrFunc
è in realtà destinata allo SecondFunc
. SecondFunc
, in questo caso, è una specie di funzione di callback e può eseguire azioni, incluse le modifiche DOM, che non desidero eseguire immediatamente.
Per questo motivo, la mia domanda è: C'è un modo per verificare se una funzione ritorna senza eseguirla?
Una cosa che avevo considerato è stato quello di chiamare BoolOrFunc.toString()
, poi eseguire una ricerca delle espressioni regolari per il valore di ritorno, qualcosa sulla falsariga di ...
if(typeof BoolOrFunc === 'boolean'
|| (typeof BoolOrFunc === 'function'
&& BoolOrFunc.toString().search(/return (true|false);/) !== -1)) {
// BoolOrFunc is either a boolean or contains a return string with a boolean.
// Handle it as the intended argument.
}
Si noti che il codice di cui sopra non può funzionare come scritto: In realtà non ho mai creato un caso di test, perché, beh, sembra eccezionalmente inefficiente e potenzialmente inaffidabile, e ho pensato che qualcuno qui avrebbe potuto trovare una soluzione più elegante al mio dilemma. Detto questo, ho pensato di includerlo a fini di discussione.
Come nota laterale aneddotica, questo è abbastanza vicino al problema di interruzione (http://en.wikipedia.org/wiki/Halting_problem) che è indecidibile su Turing Machines. :) – lexicore
Heh, tiri fuori un buon punto. Probabilmente mi aspetto troppo da JS. : P – Meshaal
Nel caso in cui gli utenti chiamino il modulo che fornisce un valore booleano e una funzione che restituisce un valore booleano, è possibile richiedere invece che passino negli argomenti inclusi in un oggetto, ad es. 'Ob.func (myvar, mystring, myobj, {boolarg: true, funcarg: my_func_that_returns_bool}); 'o qualcosa del genere, per renderlo univoco di cosa si tratta. Quindi l'utente deve assicurarsi che 'my_func_that_returns_bool' faccia come pretende – Brandin