Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   this+callback (https://javascript.ru/forum/misc/29935-callback.html)

Rootpassword 17.07.2012 21:45

this+callback
 
Если у нас есть чужая глобальная функция
method(a,b, callback);

method отрабатывает, вызывает функцию callback.
1) Мне вообще представлялось логичным, что this для вызова callback сохранится, если нет-это можно считать логической ошибкой?
2) нормальный фикс ситуации? ничего проще не придумывается.
var f=(function(){var temp=this; return (function(e){ callback.call(temp,e) }) }).call(this);
method(a,b,f);

oneguy 17.07.2012 22:14

1) если функция вызывается обычным способом, не как метод, то this получает значение глобального объекта (или undefined в строгом режиме) - это правильное поведение согласно спецификации.
2) этот код можно сократить:
var f=callback.bind(this);
method(a, b, f);

Rootpassword 17.07.2012 22:28

1) Я, естественно,вызываю method.apply(this) а не method, и не получаю нужного this у callback
2) Bind же в jQuery, если его нету, именно так и эмулируется.

devote 17.07.2012 22:39

Цитата:

Сообщение от Rootpassword
Bind же в jQuery

причем тут джуквери? bind это нативный метод, отсутсвовать он может только в старых браузерах.

https://developer.mozilla.org/en/Jav.../Function/bind

Rootpassword 17.07.2012 22:41

Точнее в IE<9 он отсутствует, для которых в jQuery и не поленились написать фикс.

oneguy 17.07.2012 22:42

1) если вы вызываете method.apply(this), то функция method получает this, а если ещё внутри method вызывается 2-ой аргумент, то этой функции автоматически не передаётся это значение в качестве this, его нужно отдельно привязать с помощью callback.bind(this).

Rootpassword 17.07.2012 22:46

Цитата:

Сообщение от oneguy (Сообщение 189601)
1) если вы вызываете method.apply(this), то функция method получает this, а если ещё внутри method вызывается 2-ой аргумент, то этой функции автоматически не передаётся это значение в качестве this, его нужно отдельно привязать с помощью callback.bind(this) или callback.apply(this).

Ну естественно. Но функция-то чужая, т.е. фиксить ее нельзя. Вопрос-то был в том, является ли не-прокидывание this в коллбек ошибкой, и как это исправить не через редактирование method


Часовой пояс GMT +3, время: 07:39.