Tengo algunas funciones que ocasionalmente (no siempre) recibirán una devolución de llamada y la ejecutarán. ¿Verificar si la devolución de llamada está definida / funciona es un buen estilo o hay una mejor manera?
Ejemplo:
function save (callback){
.....do stuff......
if(typeof callback !== 'undefined'){
callback();
};
};
javascript
coding-style
callback
henry.oswald
fuente
fuente
typeof callback !== undefined
así que'
save()
? ¿Eso no dará un error o una advertencia porque falta un argumento? ¿O está perfectamente bien y la devolución de llamada es simplementeundefined
?Respuestas:
Yo personalmente prefiero
typeof callback === 'function' && callback();
El
typeof
comando es sin embargo poco fiables y sólo debe utilizarse para"undefined"
e"function"
El problema con
typeof !== undefined
es que el usuario puede pasar un valor que está definido y no una funciónfuente
typeof
no es dudoso. A veces es vago, pero no lo llamaría dudoso. Sin embargo, estoy de acuerdo en que si va a llamar a la devolución de llamada como una función, es mejor verificar que en realidad sea una función y no, ya sabe, un número. :-)"object"
95% del tiempo.typeof
no causa boxeo.typeof "foo"
es"string"
, no"object"
. En realidad, es la única forma real de saber si se trata de una cadena primitiva uString
objeto. (Quizás esté pensando enObject.prototype.toString
, que es muy útil , pero causa boxeo).&&
cierto, uso maravillosamente idiomático de ..toString
es encantador encontrar el[[Class]]
.También puedes hacer:
Es especialmente útil si usa el
callback
en algunos lugares.Además, si está utilizando
jQuery
, ya tiene una función como esa, se llama $ .noopfuente
callback = callback || function(){};
function save (callback=noop) { ...
Simplemente haz
Prefiero llamar a la devolución de llamada si se proporciona, sin importar de qué tipo sea. No permita que falle en silencio, para que el implementador sepa que pasó en un argumento incorrecto y pueda solucionarlo.
fuente
ECMAScript 6
fuente
En lugar de hacer que la devolución de llamada sea opcional, simplemente asigne un valor predeterminado y llámelo sin importar qué
Cuando se utilizan
Este estilo se llama estilo de continuación-pase . Aquí hay un ejemplo real
combinations
, que genera todas las combinaciones posibles de una entrada ArrayDebido a que
combinations
se define en estilo de paso de continuación, la llamada anterior es efectivamente la mismaTambién podemos pasar una continuación personalizada que hace algo más con el resultado.
El estilo de continuación de pases se puede utilizar con resultados sorprendentemente elegantes
fuente
Me cansé tanto de ver el mismo fragmento una y otra vez que escribí esto:
Tengo cientos de funciones que hacen cosas como
o lo que sea...
Soy escéptico de toda la estrategia de "asegúrese de que funcione". Los únicos valores legítimos son una función o una falsedad. Si alguien pasa un número distinto de cero o una cadena no vacía, ¿qué vas a hacer? ¿Cómo lo resuelve ignorar el problema?
fuente
save( { callback : confirmProfileSaved, priority: "low" })
Una función válida se basa en el prototipo de función, utilice:
para asegurarse de que la devolución de llamada sea una función
fuente
Si el criterio para ejecutar la devolución de llamada es que esté definido o no, entonces está bien. Además, sugiero verificar si realmente es una función adicional.
fuente
Me he movido a coffee-script y encontré que los argumentos predeterminados son una buena manera de resolver este problema
fuente
Se puede hacer fácilmente con ArgueJS :
fuente