Javascript 调用youtube构造函数方法时,将丢失此方法的上下文

Javascript 调用youtube构造函数方法时,将丢失此方法的上下文,javascript,youtube,Javascript,Youtube,我已经使用youtube iframe api创建了一个youtube播放器,我正在收听结束事件,但我意识到我丢失了对此的引用,它将成为窗口,但我真的不确定如何解决此问题。我已经试着将这个绑定到contsructor等,但是没有任何乐趣,所以在你们的帮助下可以做什么 JS startPlayer: function (videoId) { var instance = this; console.log('startPlayer', instan

我已经使用youtube iframe api创建了一个youtube播放器,我正在收听
结束
事件,但我意识到我丢失了对
的引用,它将成为窗口,但我真的不确定如何解决此问题。我已经试着将
这个
绑定到contsructor等,但是没有任何乐趣,所以在你们的帮助下可以做什么

JS

startPlayer: function (videoId) {

            var instance = this;
            console.log('startPlayer', instance);

            if( instance.flags.isPlaying ) {

                instance.selectors.playerCtn.empty();

                instance.flags.isPlaying = false;

            }

            instance.selectors.playerCtn.append('<div id="player"></div>');

            instance.player = new YT.Player('player', {
                height: '390',
                width: '640',
                videoId: videoId,
                events: {
                    'onReady': this.onPlayerReady,
                    'onStateChange': this.onPlayerStateChange
                }
            });

            instance.flags.isPlaying = true;
        },

onPlayerStateChange: function (event) {
            console.log('onPlayerStateChange');

            var instance = this;

            console.log(instance); //undefined??

            if (event.data == YT.PlayerState.PLAYING) {
                console.log('PLAYING...');
            }

            if (event.data == YT.PlayerState.PAUSED) {
                console.log('PAUSED...');
            }

            if (event.data == YT.PlayerState.ENDED) {

                console.log('what is this', instance);

                // if instance.counter === instance.playlist
                if (instance.counter === instance.playlist) {
                    console.log('you\'ve come to the end of your playlist');
                    // Display message or go back to first?
                    return;
                }

                // Increase the counter
                instance.counter++
                // Set the new current element
                instance.current = instance.selectors.listItems[instance.counter];

                console.log(instance.counter);
                console.log(instance.current);

                // Get the new current element data-id
                var videoId = instance.current.attr('data-id');

                // Start the player
                startPlayer(videoId);
            }

            if (event.data == YT.PlayerState.BUFFERING) {
                console.log('BUFFERING...');
            }
        }
startPlayer:function(videoId){
var实例=这个;
log('startPlayer',实例);
如果(instance.flags.isplay){
instance.selectors.playerCtn.empty();
instance.flags.isplay=false;
}
instance.selectors.playerCtn.append(“”);
instance.player=新的YT.player('player'{
高度:“390”,
宽度:“640”,
videoId:videoId,
活动:{
“onReady”:this.onPlayerReady,
“onStateChange”:this.onPlayerStateChange
}
});
instance.flags.isplay=true;
},
onPlayerStateChange:函数(事件){
log('onPlayerStateChange');
var实例=这个;
console.log(实例);//未定义??
if(event.data==YT.PlayerState.PLAYING){
console.log('PLAYING…');
}
如果(event.data==YT.PlayerState.PAUSED){
console.log('PAUSED…');
}
如果(event.data==YT.PlayerState.end){
log('这是什么',实例);
//如果instance.counter==instance.playlist
if(instance.counter==instance.playlist){
log('您已经到了播放列表的末尾');
//显示消息还是返回到第一个?
返回;
}
//增加计数器
实例计数器++
//设置新的当前元素
instance.current=instance.selectors.listItems[instance.counter];
console.log(instance.counter);
console.log(instance.current);
//获取新的当前元素数据id
var videoId=instance.current.attr('data-id');
//启动播放器
startPlayer(videoId);
}
if(event.data==YT.PlayerState.BUFFERING){
log('BUFFERING…');
}
}
测试页面


此外,为什么
var instance=this
这个
的输入时间很短,并且在任何闭包中都没有使用
实例

我添加了。绑定到除实际事件之外的所有地方!谢谢你@styler事件处理程序通常是您需要绑定的唯一位置,除非您将函数引用传递给其他用途,并且需要它们保持绑定。是的,我不需要使用实例,因此将交换它@styler您有时会看到人们将
这个
别名为局部变量,这样可以得到更好的压缩代码,但是我相信在gzip压缩之后,它不会改变任何东西,即使它改变了,然后我会把这个任务委托给最小化程序本身。是的,我有时会对我应该用它做什么感到困惑,我应该给它加个别名,还是我应该在阅读其他代码的基础上直接使用它,等等,我完全明白你的意思。谢谢你的解释!
events: {
    'onReady': this.onPlayerReady.bind(this),
    'onStateChange': this.onPlayerStateChange.bind(this)
}