Вызов функции с «этим» - PullRequest
       10

Вызов функции с «этим»

11 голосов
/ 28 ноября 2008

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

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

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

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

Ответы [ 2 ]

26 голосов
/ 28 ноября 2008

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

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

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

11 голосов
/ 28 ноября 2008

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

Я знаю, что могу передать это в качестве аргумента 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
}

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

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