' this '在json回调中是否不可见?
is `this` invisible in a json callback?
下面的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函数
- 注册后是否可以定义HTML5自定义元素中的生命周期回调
- Node.js如何知道回调的第一个参数是否是错误处理程序
- 客户端如何知道发射是否失败?socket.emit()有回调吗
- 谷歌DFP动态广告刷新-是否有回调来确定广告是否已加载
- 确定回调是否使用所有参数
- CollectionFS中是否存在用于文件下载的事件侦听器/回调
- KnockoutJs中是否有UI刷新后的回调
- 谷歌地图API v3:缩放更改后是否有回调或事件侦听器
- socket.io (nodejs) 是否通过在回调完成期间阻止服务器来影响服务器性能
- 我们是否可以安全地从套接字参数的回调中分配对象引用
- ajax 回调是否总是在循环后执行
- 关闭离子侧菜单时是否有任何回调
- 异步函数的 JavaScript 回调:是否有任何模式可以区分“返回值”和“异常”
- 我是否需要为每个具有等待结果回调的方法关闭
- 是否将 JavaScript 回调函数作为必需参数传递
- 从前一个事务的完整回调开始打开新的 IndexedDb 事务是否安全
- 使用原型时是否可以直接将类方法作为回调传递
- 是否保证传递给 always 函数的回调将在函数(数据)回调完成其工作后调用
- Socket.io - 是否可以将回调函数作为套接字发出事件中的参数传递
- 是否有对历史的回调