Я пытаюсь передать область действия функции методу обратного вызова. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю объектную область, которая не предоставляет мне доступ к параметрам и локальным переменным в исходной функции. Мое понимание "this" означает текущий контекст (будь то окно или какой-либо объект) в дополнение к локально объявленным переменным и параметрам. [цитирует Ричарда Корнфорда отличную работу в http://jibbering.com/faq/notes/closures/ в разделе "Контексты выполнения" ]. Я также понимаю, что переменные в JavaScript имеют область действия (что, если они объявлены внутри функции, они доступны только из этой функции).
С этим пониманием, в новой среде, я пытаюсь закодировать шаблон, который я сделал много для моего предыдущего работодателя, вызвав асинхронный метод, указав обработчик обратного вызова и передав мою текущую область, ожидая, что он будет доступен в метод обратного вызова. Я не считаю, что это имеет место в моей нынешней среде. (раскрытие: я использовал ExtJS в своей предыдущей среде... заставляя меня чувствовать себя так же, как будто я был слишком умен с каркасом, делая предположения о том, что происходит).
Мой простой тестовый код демонстрирует, что я пытаюсь сделать и что не работает.
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();
Проблема в том, что 'this', переданный MySvcWrap.doWork, является глобальным объектом Window в этом случае. Мое намерение - передать контекст выполнения функции в myHandler.
То, что я пробовал. Если вместо 'this' я передаю объект, который работает, например:
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
}
Мне нужно, чтобы кто-то завязал меня за голову здесь... когда я проходил 'this' в моем первом случае, конечно, это глобальная область (я нахожусь в глобально определенной функции)... Моя проблема в том, что я подумал, передавая область, к которой у меня был доступ к локально определенным переменным и параметрам w/в этом контексте... Я качаю свое предыдущее понимание JS?? Как выполнить эту задачу?