Вопрос по oop, javascript, callback – Где мое «это»? Использование метода объектов в качестве функции обратного вызова

6

У меня есть общий вопрос о спецификации JavaScript или реализации указателя функций (делегатов?), Которые указывают на методы объекта.

Пожалуйста, прочитайте следующий фрагмент кода. Здесь у нас есть объект с методом, использующим «this» чтобы получить доступ к полю объекта. Когда мы вызываем этот метод как обычно (o.method();), возвращает значение указанного поля объекта. Но когда мы создаем указатель на этот метод (обратный вызов) и вызываем его, возвращается неопределенное значение, потому что «это» область действия метода теперь является глобальным объектом.

var o = {
    field : 'value', 
    method : function() {
        return this.field;
    }
};

o.method(); // returns 'value'

var callback = o.method;

callback(); // returns 'undefined' cause 'this' is global object

Итак, где же мои "это"?

Ваш Ответ

3   ответа
10

& Quot; это & Quot; Позднее связывание.м функции. То, с чем это связано, зависит от того, как вы вызываете свою функцию.

если вы называете это как (вызов функции):

   myfunction();

& Quot; это & Quot; привязан к глобальному объекту

если вы называете это как (вызов метода):

   myobject.myfunction();

& Quot; это & Quot; привязывается к "myobject"

Вы также можете назвать это так (вызов вызова):

   myfunction.call(myobject);

в этом случае «это» привязывается к моему объекту

также есть (вызов конструктора):

 new MyFunction();

в котором «это» связывается с недавно созданным пустым объектом, прототип которого - MyFunction.prototype.

так все же говорят об этом создатели javascript. (и я думаю, что это обсуждается в спецификации). Различные способы вызова функции.

новая версия стандарта ecmascript (ecmascript5) включает в себя библиотеку прототипов "bind" метод, который возвращает новую функцию с & quot; this & quot; предварительно привязан к тому, что вы указываете. например:

  mynewfunction = myfunction.bind(myobject);
  mynewfunction();

вызов mynewfunction имеет «this» уже привязан к моему объекту.

Error: User Rate Limit Exceededdigital-web.com/articles/scope_in_javascript Eddie Gems
1

this например, когда вы вызываете метод через.apply() или же.call() методы. В вашем случае, как вы сказали, контекст изменился. Если вам действительно нужно сделатьfield бытьo.field, вы должны явно указать это, например, используя замыкание при определении вашегоmethod метод.

Error: User Rate Limit Exceeded Eddie Gems
Error: User Rate Limit Exceeded
-1

это был неверный JavaScript. Я думал об использовании новой функции, которая позволяет вам иметь несколько экземпляров:


function o2(value) {
    var _this = this;
    this.field = value;
    this.method = function() { 
        return _this.field;
    };
}

var test1 = new o2('blah'); var test2 = new o2('meh');

var callback1 = test1.method; var callback2 = test2.method;

alert(callback1()); alert(callback2());

Alternatively if you want to continue using a singleton you can reference o from within the object.

var o = {
    field : 'value', 
    method : function() {
       return o.field;
    }
};
Error: User Rate Limit Exceeded

Похожие вопросы