在生产服务器上更改`this`的范围?

时间:2013-08-12 18:58:03

标签: javascript backbone.js

我在Backbone View中有以下三个功能。最初,在updateTimerPlayback功能中对StartRecording的调用触发了一个错误,该错误在我使用this的通话之后就消失了,就像在this.updateTimer中一样。但是,我现在在生产服务器上放置一个演示应用程序(代码编译成一个文件),并且调用this.updateTimer会触发错误

 Uncaught TypeError: Object #<Object> has no method 'updateTimer' (repeated 28 times)

你能解释一下这可能是什么原因吗?

在本地计算机上运行的三个功能:

     PlayBack: function(e){
         e.preventDefault();
        this.updateTimer(0);
        SC.recordPlay({
            progress: function(ms) {
                this.updateTimer(ms);
            }
        });

      },

      updateTimer: function(ms){
         $('.status').text(SC.Helper.millisecondsToHMS(ms));


      },

      StartRecording: function(e){

         $('#startRecording').hide();
          $('#stopRecording').show();
          e.preventDefault();
          SC.record({
            progress: function(ms, avgPeak) {
              this.updateTimer(ms);
            }
          });

      },

从生产服务器的控制台

,PlayBack: function(t) {
        t.preventDefault(), this.updateTimer(0), SC.recordPlay({progress: function(t) {
                this.updateTimer(t)
            }})
    },updateTimer: function(t) {
        $(".status").text(SC.Helper.millisecondsToHMS(t))
    },StartRecording: function(t) {
        $("#startRecording").hide(), $("#stopRecording").show(), t.preventDefault(), SC.record({progress: function(t) {
                this.updateTimer(t)
Uncaught TypeError: Object #<Object> has no method 'updateTimer' (repeated 28 times)
            }})

1 个答案:

答案 0 :(得分:3)

您收到错误是因为this上下文在您传递给SC.record的内部函数中丢失,并且不再引用您的Backbone视图。有几种解决方法,其中一种方法是利用闭包并创建对正确this的引用,并在progress回调中使用它:

  StartRecording: function(e){
     var self = this;
     $('#startRecording').hide();
      $('#stopRecording').show();
      e.preventDefault();
      SC.record({
        progress: function(ms, avgPeak) {
          self.updateTimer(ms);
        }
      });

  },

updateTimer中对SC.recordPlay的调用中对Playback的调用也是如此。