Функция вызова с помощью "this"

У меня есть обработчик onclick для <a> element (фактически, это обработчик, созданный jQuery, но это не важно). Это выглядит так:

function handleOnClick() {
    if(confirm("Are you sure?")) {
        return handleOnClickConfirmed();
    }
    return false;
}

Из этой функции объект этот доступен как <a> элемент щелкнул. Однако handleOnClickConfirmed этот является элементом Window! Я хочу, чтобы handleOnClickConfirmed имел тот же этот, что и handleOnClick. Как мне это сделать?

(Я знаю, что могу передать этот как аргумент handleOnClickConfirmed, но некоторые из моего кода уже используют handleOnClickConfirmed, и я не хочу переписывать эти вызовы. Кроме того, я думаю, используя этот выглядит чище.)

Ответ 1

Следующее должно сделать это:

function handleOnClick() {
    if( confirm( "Sure?" ) ) {
        return handleOnClickConfirmed.call( this );
    }
    return false;
}

Функция call(), прикрепленная к объектам Function, предназначена для этого; вызов функции с нужным контекстом. Это чрезвычайно полезный трюк при настройке обработчиков событий, которые возвращаются к функциям внутри других объектов.

Ответ 2

Ответ Rob - лучший ответ на вашу проблему, но я хотел бы обратиться к тому, что вы написали в своем оригинальном вопросе:

Я знаю, что могу передать это как аргумент handleOnClickConfirmed, но некоторые из моего кода уже используют handleOnClickConfirmed, и я не хочу переписывать эти вызовы.

Параметры JavaScript всегда являются необязательными, что касается интерпретатора. Например, если у вас есть функция:

function MyFunction(paramA, paraB) {
  // do nothing
}

Все эти вызовы будут выполняться без ошибок:

MyFunction(1,2);
MyFunction(1);
MyFunction();

Итак, вы можете изменить handleOnClickConfirmed, чтобы принять то, что по существу было бы необязательным параметром. Например:

function handleOnClickConfirmed(context) {
  context = context || this;
  // use context instead of 'this' through the rest of your code
}

Опять же, в этом конкретном случае функция вызова является лучшим решением. Но техника, о которой я рассказывал выше, очень полезен в вашей панели инструментов.