в JavaScript, возникли проблемы с поддержанием области видимости в оболочке функции - PullRequest
0 голосов
/ 14 июля 2011

имеют внешние / внутренние функции, повторяемые несколько раз. внешняя функция всегда одна и та же, за исключением вызова внутренней функции, например, e.target.ffunc1().

util.func1 = function( e, successFunc, failureFunc ) {
  e.target.ffunc1( function( err ) {
    if( !err && successFunc )       successFunc();
    else if( err && failureFunc )   failureFunc();
    else if( err )                  nonblockAlert( err );
  } );
}
HTMLInputElement.prototype.ffunc1 = function( nextFunc ) {  ... }

util.func2 = func...
HTMLInputElement.prototype.ffunc2 = func...

...

пытается написать сахарную оболочку для использования при определении этих внешних функций.

попробовал очевидное:

util.wrapper = function( e, callFunc, successFunc, failureFunc ) {
        callFunc( function( err ) {
                if( !err && successFunc )       successFunc();
                else if( err && failureFunc )   failureFunc();
                else if( err )                  nonblockAlert( err );
        } );
}
util.func1 = function( e, successFunc, failureFunc ) {
  util.wrapper( e. e.target.ffunc1, successFunc, failureFunc );
}

, но это терпит неудачу, потому что this в ffunc1 - это не e.target, а событие, на которое func1 отвечал. Оглядываясь назад, это имеет смысл.

В недоумении о том, как написать функцию-обертку, которая сохраняет область (?) Вызова e.target.ffunc1, то есть при выполнении ffunc1, this равно e.target из внешней функции func1 .

(отказ от ответственности: я признаю, что многие по очень веским причинам не перегружают элементы dom, и я уважаю эту позицию. Однако)

<Ч />

решение, как, кажется, все (кроме меня) знают, было call:

util.wrapperDB = function( e, callFunc, successFunc, failureFunc ) {
        callFunc.call( e.target, function( err ) {
                if( !err && successFunc )       successFunc();
                else if( err && failureFunc )   failureFunc();
                else if( err )                  nonblockAlert( err );
        } );
}

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Вы пытались использовать метод call() для объекта функции? * Т.е. 1002 *

func.call( [this argument], arg1, arg2, ...);

В вашем коде:

callFunc.call( e.target, function( err ) {
            if( !err && successFunc )       successFunc();
            else if( err && failureFunc )   failureFunc();
            else if( err )                  nonblockAlert( err );
    } );
0 голосов
/ 14 июля 2011

Одна вещь, которая может помочь, - это метод JavaScript call, который позволяет передать то, что вы хотите, чтобы this находилось внутри вызываемой функции.Пример: e.target.ffunc1.call(e.target).

Я обновлюсь с более подробной информацией, когда доберусь до работы.

ОБНОВЛЕНИЕ: Похоже, Мартин победил меня.Рад, что ты получил это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...