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:太棒了,谢谢你:)。