Estoy intentando pasar el alcance de la función a un método de devolución de llamada. El problema que estoy teniendo es que estoy obteniendo el alcance del objeto, que no me da acceso a los parámetros y las variables locales en la función original. Mi comprensión de "esto" significa el contexto actual (ya sea ventana o algún objeto) además de variables y parámetros declarados localmente. [cite el excelente trabajo de Richard Cornford en http://jibbering.com/faq/notes/closures/ en la sección "Contextos de ejecución"]. También entiendo que las variables en JavaScript tienen alcance de función (que si se declaran dentro de una función, solo son accesibles desde esa función). Con ese entendimiento, en un nuevo entorno, intento codificar un patrón que hice mucho para mi anterior empleador, llamar a un método asincrónico, especificar un manejador de devolución de llamada y pasar mi alcance actual, esperando que esté disponible en el método de devolución de llamada. No estoy encontrando que este sea el caso en mi entorno actual. (divulgación: estaba usando ExtJS en mi entorno anterior ... haciéndome sentir como si fuera un poco demasiado acogedor con el framework, haciendo suposiciones sobre lo que estaba pasando).Pasando el ámbito a la función de devolución de llamada/vinculación
Mi código de prueba simple demuestra lo que estoy tratando de hacer y lo que no funciona.
function myHandler(data, ctx) {
console.log('myHandler(): bar: ' + bar); // <- prob: bar undefined
console.log(JSON.stringify(data));
}
MySvcWrap = {
doWork: function(p1, callback, scope) {
var result = {colors: ['red', 'green'], name:'Jones', what: p1};
if (callback) {
callback.call(scope||this,result, scope);
}
}
}
function lookup() {
var bar = 'food'; // local var
MySvcWrap.doWork('thang', myHandler, this); // scope object is this
}
lookup();
El problema aquí es que el 'esto' se pasa a MySvcWrap.doWork es el objeto global de la ventana en este caso. Mi intención es pasar el contexto de ejecución de la función a myHandler.
Lo que he intentado. Si, en lugar de 'esto', me pasa un objeto, que funciona, por ejemplo:
function myHandler(data, ctx) {
console.log('myHandler(): this.bar: ' + this.bar); // <- no prob: this.bar
console.log(JSON.stringify(data));
}
function lookup() {
var bar = 'food'; // local var
MySvcWrap.doWork('thang', myHandler, {bar: bar}); // scope object is just object
}
Necesito a alguien que me palo sobre la cabeza aquí ... al pasar 'esto' en mi primer caso, por supuesto este es el alcance global (estoy en una función definida globalmente) ... Mi problema es que pensé al pasar el alcance que tenía acceso a las variables y parámetros definidos localmente con ese contexto ... ¿Estoy oscilando mi comprensión anterior? de JS? ¿Cómo lograr esta tarea?
me gusta el parametrizado enfoque del manejador. –