在json回调中看不见`this`?

时间:2011-10-25 11:34:20

标签: javascript scope coffeescript

CoffeeScript等价物生成以下JS代码。

我想将对象添加到滑块小部件,这些对象的属性来自Django REST view,没什么特别的,只是一个字典列表。

我对CoffeeScript和Django都很陌生,我不理解this的可见性。

这两个版本中,一个有效,另一个没有。

Slider.prototype.manageObject = function(itemId, colorSequence) {
  var obj;
  obj = this;
  return $.getJSON("http://localhost:8000/api/?item=" + itemId, function(data) {
    return obj.managed.push([itemId, data]);
  });
};

Slider.prototype.manageObject = function(itemId, colorSequence) {
  return $.getJSON("http://localhost:8000/api/?item=" + itemId, function(data) {
    return this.managed.push([itemId, data]);
  });
};

为什么?

5 个答案:

答案 0 :(得分:3)

问题是this的值取决于上下文。它通常是指当前对象,在第二种情况下是回调函数。通过分配obj = this,您可以在变量Slider中保留对obj的原始引用,因此调用managed.push有效,在第二种情况下,您尝试调用managed.push函数在回调函数上不存在。

thishttp://www.quirksmode.org/js/this.htmlhttp://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

的非常好的解释

答案 1 :(得分:2)

this内的第二个版本$.getJSON变量指向jQuery对象。在第一个中,您将非常需要的this存储到obj变量。然后只需访问它。

+ 为了更清楚,代码片段的第3行this指向Slider.prototype

答案 2 :(得分:1)

Javascript在方法和函数之间没有区别,因此所有函数都会收到隐藏的this变量。这取决于你如何调用函数:

使用点“方法”表示法调用的函数将this设置为适当的对象:

obj.method(args);
//this inside method will be obj

自己调用的函数会收到一个你无法使用的无用this。这可以说是一个设计错误,因为从父函数继承它会更有用

getJson( ..., function(result){
    //we are inside another function now
    //it has its own useless "this" that shadows the one that you actually want
});

通常的workaroud正是通过将正常变量设置为原始“this”并使用它来完成您原来所做的事情。通常的做法是调用变量that

var that = this;
getJson(..., function(){
    that.managed ///...
});

答案 3 :(得分:0)

在发出异步请求后调用回调。因此,回调的调用范围与声明的范围不同,this关键字将引用除您期望之外的其他内容。因为它在与obj变量相同的闭包中定义,所以该函数可以访问存储在该辅助变量中的初始this值。

答案 4 :(得分:0)

在示例1中,“this”指的是Slider函数,其中示例2中的“this”在$ .getJSON()函数执行的回调中被调用,因此它指向$ .getJSON函数