2011-11-03 17 views
2

我有這樣一段代碼:如何使用「本」在Javascript

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不是一個函數」在控制檯中。有人可以幫我解決這個問題嗎?

在此先感謝。

回答

1

嘗試在一個封閉捕獲它:

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 

     } 
    } 
}); 
+1

不是很MooToolish ... –

+0

+1我覺得這是優選的'.bind'因爲它更便宜,雖然性能不是關鍵的,你可以做任何依賴於你的可讀性偏好。 –

+0

JavaScript對象的一個​​非常好的參考,包括使用閉包的方法是:http://helephant.com/2008/08/17/how-javascript-objects-work/ –

-1

嘗試使用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); 
}); 
+0

完全錯誤。 'doSteps'不是這個'event'的方法。 –

+0

dosteps()沒有在範圍內聲明,所以我只是猜到了 – Qchmqs

0

就行導致了問題this指對象的函數屬於,即events,它確實沒有任何成員doSteps

3

瞭解this在javascript中非常重要。這Article應該幫助你。

+0

謝謝你的鏈接。 – beingalex

3

您需要綁定this,所以函數的作用域指的是正確的this

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

這是MooTools的方式。

0

你可以在每個函數中傳遞這個,這個。

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


    }, this);