Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:Object';jQuery方法中的this.var_Javascript_Jquery_Oop - Fatal编程技术网

Javascript:Object';jQuery方法中的this.var

Javascript:Object';jQuery方法中的this.var,javascript,jquery,oop,Javascript,Jquery,Oop,我想不出这个: 我有一个函数,例如 function test () { this.rating = 0; $j('#star_rating a').click(function() { alert(this.rating); }); } var foo = new test(); 功能测试(){ 这一等级=0; $j(“#星级a”)。单击(函数(){ 警报(此为额定值); }); } var foo=新测试(); 单击它会发出“未定义”警报。怎么了?请帮助。在内。单击()

我想不出这个:

我有一个函数,例如

function test () { this.rating = 0; $j('#star_rating a').click(function() { alert(this.rating); }); } var foo = new test(); 功能测试(){ 这一等级=0; $j(“#星级a”)。单击(函数(){ 警报(此为额定值); }); } var foo=新测试(); 单击它会发出“未定义”警报。怎么了?请帮助。

内。单击()
指的是单击的项目。因此,上下文与设置
评级时不同。这两个
是不同的

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

此外,您可能希望
返回false
事件.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();
在函数内部,“this”是已单击的元素,与函数外部的“this”不同。一个简单的解决方案:

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

在两种情况下都不同。尝试在firebug中使用断点以查看它们设置为什么。

如果您想在对象内部保留类似于
的引用,以供以后使用,而
可能意味着其他内容,将
指定给本地实例变量是一个常见的技巧。我使用
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”是对窗口(全局)对象的引用。实际上,您所做的是设置一个全局变量,可能不是预期的副作用。(使用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”