Javascript:对象是jQuery方法中的this.var

时间:2010-10-19 23:16:05

标签: javascript jquery oop

我无法想出这个:

我有一个功能,例如

function test () {
  this.rating = 0;
  $j('#star_rating a').click(function() {
    alert(this.rating);
  });
}

var foo = new test();

点击它会提醒“未定义”。怎么了?请帮忙。

5 个答案:

答案 0 :(得分:5)

.click()内,this指的是点击的项目。因此,上下文与设置rating时的上下文不同。这两个this是不同的。

你需要以某种方式保存上下文。

此外,如果您点击链接并且不想刷新页面,则可能需要return false;event.preventDefault()

function test () {

  this.rating = 0;
  var oldThis = this;           // Conserving the context for use inside .click()

  $j('#star_rating a').click(function() {

       alert(oldThis.rating);

       return false; // Use this if you don't want the page to change / refresh
  });
}

var foo = new test();

Try it out with this jsFiddle

答案 1 :(得分:2)

在函数内部,“this”是单击的元素,与函数外部的“this”不同。一个简单的解决方法:

function test () {
  this.rating = 0;
  var self = this;
  $j('#star_rating a').click(function() {
    alert(self.rating);
  });
}

答案 2 :(得分:1)

如果您希望在对象内部保留this之类的引用,以便稍后在this可能意味着其他内容时使用,则将this分配给本地是一种常见技巧实例变量。我使用self

function test () {
  var self = this;
  self.rating = 0;
  $j('#star_rating a').click(function() {
    alert(self.rating);
  });
}

var foo = new test();

这个技巧的优势在于,在对象中的所有代码中 - 甚至是闭包 - self将始终引用该对象。您也可以使用this来指代它通常意味着什么。

答案 3 :(得分:1)

像其他人所说的那样,“this”在测试中是不同的,并且匿名函数传递给click()。

test是一个全局函数,因此,“this”是对window(全局)对象的引用。你实际在做的是设置一个全局变量,可能不是一个预期的副作用。 (使用alert(window.rating)看看我的意思)

对于您的示例,不需要使用“this”,但我认为您的示例只是为了证明一点。如果它是真实代码,则tt应转换为:

function test () {
  var rating = 0;
  $j('#star_rating a').click(function() {
    alert(rating); //Use the closure defined in the outer function
  });
}

关键是你不应该使用全局函数中的“this”。

答案 4 :(得分:0)

this在两种情况下都不同。尝试在firebug中使用断点来查看它们的设置。