Я пытаюсь передать область действия методу обратного вызова. Проблема, с которой я столкнулся, заключается в том, что я получаю область видимости объекта, которая не дает мне доступа к параметрам и локальным переменным в исходной функции. В моем понимании «это» означает текущий контекст (будь то окно или какой-то объект) в дополнение к локально объявленным переменным и параметрам. [процитируйте превосходную работу Ричарда Корнфорда на 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' в моем первом случае, конечно, это глобальный область видимости (я нахожусь в глобально определенной функции) ... Моя проблема в том, что я думал, передавая область видимости, что у меня есть доступ к локально определенным переменным и параметрам в этом контексте ... Я качаю свое предыдущее понимание JS? Как выполнить эту задачу?