Estoy escribiendo un "módulo" de manejo de errores global para una de mis aplicaciones.¿Cómo envuelvo una función en Javascript?
Una de las características que quiero tener es poder envolver fácilmente una función con un bloque Try {} Catch {}, para que todas las llamadas a esa función tengan automáticamente el código de manejo de errores que llamará a mi método de registro global. (Para evitar contaminar el código en todas partes con bloques try/catch).
Esto es, sin embargo, un poco más allá de mi comprensión del funcionamiento de bajo nivel de Javascript, los métodos .call y .apply, y la palabra clave "this".
de escribir este código, basado en el método de Function.wrap Prototipo:
Object.extend(Function.prototype, {
TryCatchWrap: function() {
var __method = this;
return function() {
try { __method.apply(this, arguments) } catch(ex) { ErrorHandler.Exception(ex); }
}
}
});
que se utiliza como esto:
function DoSomething(a, b, c, d) {
document.write(a + b + c)
alert(1/e);
}
var fn2 = DoSomething.TryCatchWrap();
fn2(1, 2, 3, 4);
Ese código funciona perfectamente. Imprime 6 y luego llama a mi controlador de error global.
Mi pregunta es ... ¿Esto romperá algo cuando la función que estoy envolviendo está dentro de un objeto, y usa el operador "this"? Estoy un poco preocupado ya que estoy llamando. Aplicar, pasar algo allí, me temo que esto puede romper algo.
Bien, así que además de la preferencia de contaminar o no ... Su último fragmento de código parece idéntico al mío. ¿Debo entender de esto que mi código funciona con objetos y la palabra clave "this"? Gracias! –
Sí: pasa ambos argumentos "this" y original al método envuelto. Pero no devuelve su resultado, haciendo que el envolvimiento sea incompleto. Pero no importa si ajusta una función que no devuelve un valor. –