2014-10-30 87 views
0

我試圖創建一個簡單的選取框,只是簡單地改變間隔。我只是想了解Javascript中的對象。目前,我收到錯誤object is not a function面向對象的Javascript錯誤對象不是函數

var marquee = { 

      domElement: jQuery('span'), 
      titles: [ 'First', 'Second', 'Third', 'Fourth' ], 
      current: '', 
      next: 0, 

      _getCurrent: function(){ 

       this.current = this.domElement.text(); 

      }, 

      _setNext: function(){ 

       this.next = this.titles.indexOf(this.current) + 1; 

      }, 

      changeHeading: function(){ 

       this._getCurrent(); 
       this._setNext(); 
       this.domElement.text(this.titles[ this.next ]); 

      } 

     }; 

var marqueeInterval = setInterval(marquee.changeHeading, 700); 

任何幫助,爲什麼我不能得到這個工作將不勝感激。我是面向對象的Javascript的新手,我只是想明白。謝謝!

回答

3

目標方法通過傳遞函數r請撥打changeHeadingsetInterval,您將失去每次通話的上下文。你要麼防止通過添加額外的功能,像

setInterval(function() { 
    marquee.changeHeading(); 
}, 700); 

或調用Function.prototype.bind

var marqueeInterval = setInterval(marquee.changeHeading.bind(marquee), 700); 
+0

太棒了!所以基本上,「this」在傳遞給setInterval時不再指向字幕?我是否正確理解這一點? – mcbeav 2014-10-30 12:41:10

2

由於要傳遞marquee.changeHeading作爲回調到setInterval()方法中,當調用方法的執行上下文不會marquee對象

您可以使用Function.bind()如下所示

var marqueeInterval = setInterval(marquee.changeHeading.bind(marquee), 700); 

或自定義回調將調用等

var marqueeInterval = setInterval(function(){ 
    marquee.changeHeading(); 
}, 700); 
0

由於您使用jQuery,來運行你的代碼最簡單的方法是更換您的最後一行線下方

var marqueeInterval = window.setInterval($.proxy(marquee.changeHeading, marquee), 700);