面向对象的Javascript错误对象不是函数

面向对象的Javascript错误对象不是函数,javascript,jquery,oop,object,javascript-objects,Javascript,Jquery,Oop,Object,Javascript Objects,我试图创建一个简单的字幕,只是在间隔中改变。我只是想理解Javascript中的对象。当前,我收到错误,对象不是函数 var marquee = { domElement: jQuery( 'span' ), titles: [ 'First', 'Second', 'Third', 'Fourth' ], current: '', next: 0, _getCurrent

我试图创建一个简单的字幕,只是在间隔中改变。我只是想理解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,我只是想理解一下。谢谢

由于您将
marquee.changeHeading
作为setInterval()方法的回调传递,因此调用该方法时,执行上下文将不会是
marquee
对象

您可以使用如下所示的

var marqueeInterval = setInterval( marquee.changeHeading.bind(marquee), 700 );
或者调用目标方法的自定义回调,如

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

由于将
marquee.changeHeading
作为setInterval()方法的回调传递,因此调用该方法时,执行上下文将不会是
marquee
对象

您可以使用如下所示的

var marqueeInterval = setInterval( marquee.changeHeading.bind(marquee), 700 );
或者调用目标方法的自定义回调,如

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

通过将
changeHeading
的函数引用传递给
setInterval
,每次调用都会丢失上下文。您可以通过添加一个附加函数(如

setInterval(function() {
    marquee.changeHeading();
}, 700);
或者调用
函数.prototype.bind

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

通过将
changeHeading
的函数引用传递给
setInterval
,每次调用都会丢失上下文。您可以通过添加一个附加函数(如

setInterval(function() {
    marquee.changeHeading();
}, 700);
或者调用
函数.prototype.bind

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

因为您使用的是jQuery,所以运行代码的最简单方法是将最后一行替换为下面的一行

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

因为您使用的是jQuery,所以运行代码的最简单方法是将最后一行替换为下面的一行

var marqueeInterval = window.setInterval($.proxy(marquee.changeHeading, marquee), 700);
明亮的所以基本上,“this”在传递给setInterval时不再指marquee了?我理解对了吗?太棒了!所以基本上,“this”在传递给setInterval时不再指marquee了?我理解正确吗?