0

我有一个自定义 Javascript 对象,如下所示:

var CustomClass = function(settings) {

this.var_1 = false;
this.var_2 = null;
this.var_3 = 0;

}

CustomClass.prototype.method_1 = function(){

  var reader = new FileReader();
reader.onload = (function(cropWidget) {
      this.var_1 = true; 
    });
}

CustomClass.prototype.method_2 = function(){

console.log(this.var_1); // logs 'false' onto the console  
if(this.var_1)
 { // proceed further and do something
 }
}

CustomObject 被实例化:

$(document).ready(function{;  
  var customObj = new CustomClass({/*json values*/});
});

然后,另一个 DOM 事件将调用 method_1,例如:

$('#element1').click(function(){
   customObj.method_1(); // this is where var_1 is being set to true
});

当另一个元素在 DOM中调用 method_2() 时,就会出现问题,如下所示:

$('#element2').click(function(){
  customObj.method_2();
});

检查 var_1 的值,正如您所记得的,当 customObj 调用 method_1 时该值已设置为 true

this.var_1 是假的,而不是应有的真。这是否意味着 var_1 的范围仅在 method_1() 的范围内设置为 true 并且仍然保留它的旧值?IMO Javascript 是通过引用传递的,因此变量值应该在其原始位置设置为 true。

有人可以解释我哪里出错了,我可以如何设置 var_1 的值,以便它在 method_2 中也保留它的新值?

4

2 回答 2

3

问题是您设置var_1为 true 的范围不是您想要的:

CustomClass.prototype.method_1 = function(){

  var reader = new FileReader();
  reader.onload = function(cropWidget) {
    this.var_1 = true;
  };
}

您在回调中设置var_为,并且回调true的值与this中的不同。method_1

你可以使用self = this成语来解决这个问题:

CustomClass.prototype.method_1 = function(){
  // "this" here refers to the CustomClass instance,
  // so let's store it in "self" so we can use it in the callback
  var self = this; 

  var reader = new FileReader();

  reader.onload = function(cropWidget) {
    // "this" here will not be the CustomClass instance, 
    // so we refer to the "self" variable from above.
    self.var_1 = true;
  };
}

这应该可以解决您的问题,尽管仍然存在潜在的时间问题:如果在触发其事件method_2之前调用,则不会设置为.FileReaderonloadvar_1true

于 2013-02-08T20:44:31.713 回答
2

this.var_1 是假的,而不是应有的真。

这可能是因为您没有引用同一个对象。您的事件处理程序function(){ var customObj = new CustomClass(…); }创建一个实例并将其分配给一个局部变量。一旦函数运行,它将被垃圾收集。

IMO javascript 是通过引用传递的,因此变量值应该在其原始位置设置为 true。

不,javascript 始终是按值传递的。然而,当您传递对象时,您实际上传递的是引用该对象的值,因此会有很多变量引用同一个“共享”对象。

于 2013-02-08T19:43:29.420 回答