Как использовать «это» в Javascript - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть этот кусок кода:

this.json.each(function(obj, index) {
    var li = new Element('li');
    var a = new Element('a', {
        'href': '#',
        'rel': obj.id,
        events: {
            'click': function(e) {

                this.doSteps(this.step + 1); // <-- causing issue

            }
        }   
    });
    var img = new Element('img', {
        'src': imgd + obj.img,
        'alt': obj.name                        
    });
    img.inject(a);
    a.inject(li);
    li.inject(ul);
});

Я получаю сообщение об ошибке "this.doSteps не является функцией" в консоли. Может кто-нибудь помочь мне с этим и объяснить решение.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 03 ноября 2011

Вам необходимо связать this, поэтому область действия функции указана справа this.

'click': function(e) {
    this.doSteps(this.step + 1);
}.bind(this)

Это способ MooTools.

1 голос
/ 03 ноября 2011

Попробуйте захватить его в закрытии:

var li = new Element('li');
var _self = this;
var a = new Element('a', {
    'href': '#',
    'rel': obj.id,
    events: {
        'click': function(e) {

            _self.doSteps(_self.step + 1); // <-- causing issue

        }
    }   
});
0 голосов
/ 08 ноября 2011

Вы можете передать это в каждую функцию с помощью этого.

this.json.each(function(obj, index) {


    }, this);
0 голосов
/ 03 ноября 2011

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

0 голосов
/ 03 ноября 2011

попробуйте использовать e элемент, над которым вы сейчас работаете

this.json.each(function(obj, index) {
    var li = new Element('li');
    var a = new Element('a', {
        'href': '#',
        'rel': obj.id,
        events: {
            'click': function(e) {

                e.doSteps(e.step + 1); // <-- here the e from the function is your element

            }
        }   
    });
    var img = new Element('img', {
        'src': imgd + obj.img,
        'alt': obj.name                        
    });
    img.inject(a);
    a.inject(li);
    li.inject(ul);
});
...