Передача области в функцию / привязку обратного вызова

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

16
задан sudo bangbang 14 December 2016 в 08:37
поделиться