繁体   English   中英

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

[英]Javascript: Object's this.var inside jQuery method

我无法想出这个:

我有一个功能,例如

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

var foo = new test();

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

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

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

此外,您可能想要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();

尝试使用这个jsFiddle

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

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

如果你想保持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来指代它通常意味着什么。

像其他人所说的那样,“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”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM