jquery使用它在内部回调时访问对象上下文

时间:2011-11-21 12:22:12

标签: javascript jquery

我们假设我定义了以下对象:

var myObj = function(){
     this.hello = "Hello,";
}

myObj.prototype.sayHello = function(){
     var persons = {"Jim", "Joe", "Doe","John"};
     $.each(persons, function(i, person){
       console.log(this.hello + person);
  }
}

问题是在$ .each里面这是指人,但我想访问obj属性你好。

我能找到的唯一解决方案是在sayHello函数中声明类似

  

var _this = this;

然后在$ .each中我会使用像

这样的东西
console.log(_this.hello + person);

但不幸的是,这不是很好的代码。还有另一种方法可以优雅地解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

更正的示例,在正确设置时满足您的需求

myObj.prototype.sayHello = function(){
 var persons = ["Jim", "Joe", "Doe","John"];
 persons.forEach(function(person){
   console.log(this.hello + person);
 },this);
}

Check out Array.forEach for more info.

答案 1 :(得分:3)

这似乎不是一个糟糕的解决方案......也许你会对使用Function.bind更感兴趣(参见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Compatibility的兼容性),但这会导致反作用......

var myObj = function(){
     this.hello = "Hello,";
}

myObj.prototype.sayHello = function(){
     var persons = ["Jim", "Joe", "Doe","John"];
     $.each(persons, function(i, person){
       console.log(this.hello + person);
     }.bind(this) );
}

另一个解决方案是声明一个变量并将其值设置为this.hello,如下所示:

var myObj = function(){
     this.hello = "Hello,";
}

myObj.prototype.sayHello = function(){
     var persons = ["Jim", "Joe", "Doe","John"], 
         hello = this.hello;
     $.each(persons, function(i, person){
       console.log(hello + person);
     });
}

答案 2 :(得分:0)

如果您没有在$ .each范围之外定义变量,则无法找到它。您必须在$ .each函数外部进行定义才能调用。否则它将是一个未定义的对象。

如果您想定义参考,请查看以下网址:Pass additional parameters to jQuery each() callback