Javascript 这是一个获取调用问题
我在主干视图中有以下代码:Javascript 这是一个获取调用问题,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,我在主干视图中有以下代码: var BookView = Backbone.View.extend({ initialize: function() { this.render(); }, render: function() { this.model.fetch({ success : function(model, resp, opt) { alert(this.$el.html() ); //THIS ONE DOESN'T WORK? }
var BookView = Backbone.View.extend({
initialize: function() {
this.render();
},
render: function() {
this.model.fetch({
success : function(model, resp, opt) {
alert(this.$el.html() ); //THIS ONE DOESN'T WORK?
}
});
alert(this.$el.html() ); // THIS ONE WORKS FINE
}
});
我有两个警报(this.$el.html())代码>调用,一个在fetch外部,一个在fetch内部。但由于某些原因,fetch调用外部的调用可以工作,但fetch调用内部的调用返回错误:
未捕获类型错误:无法读取未定义的内部成功,此不再是视图
(在严格模式下为未定义,否则为窗口
)
要解决这个问题,可以使用公共var=this
习惯用法;有关该习惯用法的更多信息,请参见此处:
备选选项:请参见.bind()-一个合适的资源:
在success
内部,此
不再是视图
(在严格模式下为未定义
,否则为窗口
)
要解决这个问题,可以使用公共var=this
习惯用法;有关该习惯用法的更多信息,请参见此处:
备选选项:请参见.bind()-一个合适的资源:
请记住,JavaScript函数中的这个取决于函数的调用方式,而不是函数的定义方式或定义位置(当然绑定函数除外)。文档没有为success
回调指定任何特定的this
,因此它可能被作为普通函数调用(即this
是窗口中的success
回调)。结果是,this.$el
在success
回调中是undefined
您有多种选择:
使用标准的var\u this=this
技巧将所需的上下文隧道到回调中:
var _this = this;
this.model.fetch({
success : function(model, resp, opt) {
alert(_this.$el.html());
}
});
this.model.fetch({
success : function(model, resp, opt) {
alert(this.$el.html());
}.bind(this)
});
用于将绑定函数用作回调:
var _this = this;
this.model.fetch({
success : function(model, resp, opt) {
alert(_this.$el.html());
}
});
this.model.fetch({
success : function(model, resp, opt) {
alert(this.$el.html());
}.bind(this)
});
用于将回调绑定到所需的this
:
this.model.fetch({
success : _(function(model, resp, opt) {
alert(this.$el.html());
}).bind(this)
});
请记住,JavaScript函数中的这个取决于函数的调用方式,而不是函数的定义方式或定义位置(当然绑定函数除外)。文档没有为success
回调指定任何特定的this
,因此它可能被作为普通函数调用(即this
是窗口中的success
回调)。结果是,this.$el
在success
回调中是undefined
您有多种选择:
使用标准的var\u this=this
技巧将所需的上下文隧道到回调中:
var _this = this;
this.model.fetch({
success : function(model, resp, opt) {
alert(_this.$el.html());
}
});
this.model.fetch({
success : function(model, resp, opt) {
alert(this.$el.html());
}.bind(this)
});
用于将绑定函数用作回调:
var _this = this;
this.model.fetch({
success : function(model, resp, opt) {
alert(_this.$el.html());
}
});
this.model.fetch({
success : function(model, resp, opt) {
alert(this.$el.html());
}.bind(this)
});
用于将回调绑定到所需的this
:
this.model.fetch({
success : _(function(model, resp, opt) {
alert(this.$el.html());
}).bind(this)
});
这是因为您不再有权访问“this”,对“this”的内部调用实际上是引用回调函数
请尝试将“this”绑定到返回函数,或将“this”设置为渲染范围内的变量,并将其设置为“self”或其他内容
一,-
二,-
这是因为您不再有权访问“this”,对“this”的内部调用实际上是引用回调函数
请尝试将“this”绑定到返回函数,或将“this”设置为渲染范围内的变量,并将其设置为“self”或其他内容
一,-
二,-
这是javascript中的当前上下文。因此,例如,如果从按钮中调用success()
作为click事件处理程序,那么这个就是按钮
尝试检查success()
方法中的这个
到底是什么。阅读有关闭包的良好教程,例如:
作为一个快速解决方案,我建议进行以下更正:
render: function() {
var that = this; // <<<<< Change 1
this.model.fetch({
success : function(model, resp, opt) {
//alert(this.$el.html() ); //THIS ONE DOESN'T WORK?
alert(that.$el.html() ); // <<<<<< Change 2
}
});
alert(this.$el.html() ); // THIS ONE WORKS FINE
}
render:function(){
var that=this;//javascript中的this
是当前上下文。因此,例如,如果从按钮中调用success()
作为单击事件处理程序,那么this
就是按钮
尝试检查success()
方法中的这个
到底是什么。阅读有关闭包的好教程,例如:
作为一个快速解决方案,我建议进行以下更正:
render: function() {
var that = this; // <<<<< Change 1
this.model.fetch({
success : function(model, resp, opt) {
//alert(this.$el.html() ); //THIS ONE DOESN'T WORK?
alert(that.$el.html() ); // <<<<<< Change 2
}
});
alert(this.$el.html() ); // THIS ONE WORKS FINE
}
render:function(){
var that=this;//既然这被接受了,你能不能在你的答案中添加对的引用。绑定并删除OP注释。给任何读者一个机会,让他们知道哪一个最适合他们的场景。@relic:在路上自动取款机上。我已经写了我的帖子,所以请你自己随意修改,否则我很快就会做的!嘿,酷,很好的路上答案:+1:@Relic:some,谢谢你:)。既然这被接受了,你能不能在你的答案中添加引用。绑定并删除OP评论。给任何读者一个机会,让他们知道哪一个最适合他们的场景。@Relic:on-the-road-atm。我已经写了我的帖子,所以你可以自己修改,否则我很快就会做的!嘿,酷,不错在路上回答:+1:@Relic:太棒了,谢谢你:)。