Функция вызова с помощью "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
}
Опять же, в этом конкретном случае функция вызова является лучшим решением. Но техника, о которой я рассказывал выше, очень полезен в вашей панели инструментов.