Нахождение родительского объекта функции обратного вызова - PullRequest
3 голосов
/ 11 января 2012

У меня есть функция:

myObject.myFunction = function(callback){
  callback();
}

и обратный вызов

randomObject.callBack = function(){
  console.log(this);
}

если я вызываю randomObject.callBack() напрямую, я получаю родительский объект в консоли. Однако, если я позвоню myObject.myFunction(randomObject.callBack), он регистрирует элемент DOM.

Как я могу получить доступ к родительскому объекту?


Примечание

Я не знаю имени родительского объекта обратных вызовов до выполнения.

Ответы [ 3 ]

5 голосов
/ 11 января 2012

Контекст (т. Е. this значение) объекта определяется во время выполнения функции, не во время ее определения.Передача randomObject.callBack другой функции не отправляет контекст (бит randomObject);он просто отправляет функцию.

Предположительно, контекст устанавливается, когда myFunction вызывает ее.Поскольку вы явно не предоставляете контекст (например, с call или apply), контекстом будет объект window.

Вы можете изменить это, явно указав, что такое контекст функциидолжно быть до его запуска.Вы можете сделать это с помощью метода bind:

myObject.myFunction(randomObject.callBack.bind(randomObject))

Теперь при вызове callback внутри myFunction будет зарегистрировано randomObject.

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

1 голос
/ 11 января 2012

В javascript this относится к контексту объекта, в котором функция называется . Это не обязательно относится к какому-либо объекту, для которого он был определен .

Вы можете думать об этом, как будто функции не определены как члены объектов, но вызываются как члены объектов.

В зависимости от контекста this может решить четыре вещи.

  1. Вновь созданный объект, если вызову функции предшествовало новое ключевое слово.
  2. Объект слева от точки при вызове функции.
  3. Глобальный объект (обычно окно), если не указано иное.
  4. Первый аргумент, предоставленный функции call или apply.

В вашей ситуации может быть уместно что-то подобное:

myObject.myFunction(function(){randomObject.callBack()});

Это создает замыкание, так что в myFunction, callback вызывается как член randomObject.

1 голос
/ 11 января 2012

Это происходит потому, что когда вы вызываете функцию без объекта, внутри функции this будет указывать на объект Window. Чтобы избежать этого, мы обычно делаем так

myObject.myFunction = function(callback){
  callback();
}


randomObject.callBack = function(){
  console.log(this);
}

function proxyCallback(){
     randomObject.callBack();
}

myObject.myFunction(proxyCallback);
...