2016-01-17 122 views
-1

我有一个HTML页面这段JavaScript在页面的主体部分Javascript对象属性的回调函数无法访问

JSFiddle link(我是新来的jsfiddle,无法得到它的工作,任何帮助的这是赞赏...)

Firebug控制台显示我在request0undefinedonErrorcallback0。我有两个问题,为什么我不能访问onError中的this.loadErrors,以及如何实现此错误计数器?

编辑:源代码

var loader = new Loader(); 
loader.request(callback); 

function callback(){ 
    console.log("loader.loadErrors in callback: " + loader.loadErrors); 
} 

function Loader(){ 
    this.loadErrors = 0; 

    this.request=function(callback){ 
     for (var i = 0; i < 3; i++){ 
      console.log("this.loadErrors in request: " + this.loadErrors); 
      $.ajax("example", {error: onError}).done(callback); 
     } 
    } 

    function onError(){ 
     console.log("this.loadErrors in onError: " + this.loadErrors); 
     // this.loadErrors++; 
     callback(); 
    } 
} 

回答

1

代码弄乱this关键字。

onError从代码外调用,它的this指向一个未知对象(可能为null)。

为了防止这种情况发生,你有两个选择之一:

  1. bind()onError()功能,以您的Loader调用前:在

    this.request=function(callback){ 
        for (var i = 0; i < 3; i++){ 
         console.log("this.loadErrors in request: " + this.loadErrors); 
         $.ajax("example", {error: onError.bind(this)}).done(callback); 
        } 
    } 
    
  2. 将其绑定到Loader创作:

    var _this = this; 
    function onError(){ 
        console.log("this.loadErrors in onError: " + _this.loadErrors); 
        // _this.loadErrors++; 
        callback(); 
    }