从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]);
});
};
为什么?
答案 0 :(得分:3)
问题是this
的值取决于上下文。它通常是指当前对象,在第二种情况下是回调函数。通过分配obj = this
,您可以在变量Slider
中保留对obj
的原始引用,因此调用managed.push
有效,在第二种情况下,您尝试调用managed.push
函数在回调函数上不存在。
对this
:http://www.quirksmode.org/js/this.html和http://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函数