2015-11-01 61 views
0

我想创建一个幻灯片放映,我在当前完成之前加载下一张幻灯片。我有两个原型。一个用于显示当前幻灯片,然后用于加载下一张幻灯片。变量设置为undefined功能

它工作正常,直到我把setTimeout()的幻灯片之间的延迟。在setTimeout()之后,NextSlide()函数自行调用,然而this.nextSlide未定义,即使它被加载并成功添加到this.nextSlideLoadNextSlide()

$(document).ready(function(){ 
    //Set width and height of canvas 
    var width = $(document).width(); 
    var height = $(document).height(); 
    $("#MKslide").css({"width":width+"px","height":height+"px"}); 


    slideShow = new SlideShow(width, height, "2d"); 
    slideShow.LoadNextSlide(null); 
    slideShow.NextSlide(); 
}); 

function SlideShow(canvasWidth, canvasHeight, dimension){ 
    //Creating the slideshow 
} 

SlideShow.prototype.LoadNextSlide = function(currentSlideNumber){ 

    var data = $.parseJSON($.ajax({ 
     type: "POST", 
     url: "/cms/php/request.php", 
     dataType: "json", 
     data: {slideNumber : currentSlideNumber}, 
     async: false 
    }).responseText); 
    this.nextSlide = data; 
    alert(this.nextSlide.id); 
} 

SlideShow.prototype.NextSlide = function(){ 
    alert(this.nextSlide.id); 
    this.currentSlide = this.nextSlide; //Swap to next slide. 
    if(beginsWithHTTP(this.currentSlide.data)){ 
     this.image.src = this.currentSlide.data; 
    } 
    else{ 
     this.image.src = "http://" + this.currentSlide.data; //Set the current slide. 
    } 
    this.LoadNextSlide(this.currentSlide.id); //Preload next slide 
    window.setTimeout(this.NextSlide,this.currentSlide.duration * 1000);//wait x seconds before swapping 
} 

回答

3

添加bind(this)如下:

window.setTimeout(this.NextSlide.bind(this),this.currentSlide.duration * 1000); 

setTimeout时间表后执行的功能,以及当时在它执行上下文将永远是全局对象(window),而不是你的对象。这个上下文是this所指的。 bind方法会为您的方法创建一个新的引用,以覆盖此行为,并且将始终与this一起运行,并设置为您传递给bind的内容,而与被调用的上下文无关。

的替代,但不太优雅的解决方案是通过setTimeout一个匿名函数中,该方法是从你的对象的上下文明确要求:

var that = this; // keep a reference to your object 
window.setTimeout(function() { 
    that.NextSlide(); // use the reference to your object 
}, this.currentSlide.duration * 1000); 
0

您可以使用.bind或ASIGN自我=这一点,并调用函数匿名与self.nextslide它是关于范围。你也可以使用下划线绑定,因为它也可以充当polyfill。