桌面浏览器和移动游戏中的闭包处理方式不同?

时间:2010-09-08 15:11:28

标签: javascript iphone safari cross-browser closures

这是一个简单的javascript程序:

var $d = {};

var AudioPlayer = function(filename, timeUpdateCallback, playbackDone){
  // An HTML5 audio player is defined here.
}

$d.AudioPlayer = AudioPlayer;

var AudioManager = function(chapterId){
        var audioPlayer;
        var me=this;

        this.next = function(){
               ...
        }

        function playSegment(){

        //      var path='/test.mp3';
                $d.utils.log('Path is: '+path+'');
                audioPlayer = new $d.AudioPlayer(path, function(p){} ,

                        function(){
                            me.next(); 
                        }
                );

                audioPlayer.play();
        }
}

当在桌面浏览器(safari / firefox)中调用回放完成回调时,一切正常。但是,当在iPhone Safari中使用完全相同的JavaScript时,我看到一个例外“无法找到变量我”。

为什么闭包的处理方式有所不同?无论如何要解决这个问题吗?

更新:我没有提到audioPlayer依赖于PhoneGap的媒体类;它不接受其回调中的闭包。问题是回调在本机代码中存储为字符串,因此当它返回时,引用就消失了。 对于桌面浏览器,我实际上使用的是HTML5音频标签,所以我没有意识到这个问题。

2 个答案:

答案 0 :(得分:1)

您使用的是什么版本的移动游戏?

我抓住了代码的本质:

var d = {

 AudioPlayer: function (filename, timeUpdateCallback, playbackDone){
    document.write ("Audioplayer<br/>");
    return {
      play : function () {playbackDone && playbackDone ();}
    } 
  }
};  

try {
  (function AudioManager (chapterId) {
    var me = this;

    this.next = function (){
      document.write  ("AudioManager next<br/>");
    }

    function playSegment (){
      var audioPlayer = new d.AudioPlayer ('/test.mp3', function(p){} ,
        function () {
          document.write  ('playbackdone<br/>');
          me.next (); 
        }
      );

      audioPlayer.play();
    }

    playSegment ();
  }) ();
} catch (e) {
  document.write(e);
}

它可以在Chrome,iPod touch和iPad上正常运行。

答案 1 :(得分:0)

我没有提到audioPlayer依赖于PhoneGap的媒体类;它不接受其回调中的闭包。问题是回调在本机代码中存储为字符串,因此当它返回时,引用就消失了。对于桌面浏览器,我实际上使用的是HTML5音频标签,所以我没有意识到这个问题。

相关问题