' this '在json回调中是否不可见?

is `this` invisible in a json callback?

本文关键字:是否 回调 this json      更新时间:2023-09-26

下面的JS代码是由CoffeeScript等效生成的。

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

我对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]);
  });
};

为什么?

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

this的一个很好的解释:http://www.quirksmode.org/js/this.html和http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

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

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

Javascript没有方法和函数之间的区别,所以所有函数接收一个隐藏的this变量。这取决于你如何调用这个函数:

使用点"method"表示法调用的函数将把this设置为适当的对象:

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

自己调用的函数接收一个无用的this,您不应该使用。这可以说是一个设计错误,因为从父函数继承This会更有用

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

通常的解决方法是做你原来所做的,通过设置一个普通变量为原来的"this",并使用它来代替。通常的做法是将变量命名为that

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

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

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