2008-11-28 4 views
10

У меня есть обработчик onclick для элемента <a> (на самом деле это обработчик, созданный jQuery, но это не важно). Это выглядит следующим образом:Функция вызова с помощью «this»

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

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

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

ответ

26

Ниже следует это сделать:

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

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

+0

Большое спасибо. =] Я думал о каком-то этом. (Fn), но я думаю, что я получил заказ. – strager 2008-11-28 03:27:15

10

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

I know I can pass this as an argument to handleOnClickConfirmed, but some of my code already uses handleOnClickConfirmed and I don't want to have to rewrite those calls.

параметры 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 
} 

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

Смежные вопросы