Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在桌面浏览器和移动safari上处理闭包的方式不同?_Javascript_Iphone_Safari_Cross Browser_Closures - Fatal编程技术网

Javascript 在桌面浏览器和移动safari上处理闭包的方式不同?

Javascript 在桌面浏览器和移动safari上处理闭包的方式不同?,javascript,iphone,safari,cross-browser,closures,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;

下面是一个简单的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)中调用PlaybackDone回调时,一切正常。然而,在iPhone Safari中使用完全相同的javascript时,我看到一个异常“找不到变量me”

为什么在处理闭包的方式上存在差异?有什么办法可以解决这个问题吗

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

您使用的是哪个版本的mobile safari

我抓住了您代码的精髓,因此:

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);
}
var d={
AudioPlayer:函数(文件名、timeUpdateCallback、playbackDone){
document.write(“Audioplayer
”); 返回{ 播放:函数(){playbackDone&&playbackDone();} } } }; 试一试{ (功能音频管理器(章){ var me=这个; this.next=函数(){ document.write(“AudioManager下一步
”); } 功能段(){ var audioPlayer=新的d.audioPlayer('/test.mp3',函数(p){}, 函数(){ document.write('playbackdone
'); me.next(); } ); audioPlayer.play(); } 播放片段(); }) (); }捕获(e){ 文件。编写(e); }

它在Chrome、iPod touch和iPad上运行时不会出错。

您使用的是哪个版本的mobile safari

我抓住了您代码的精髓,因此:

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);
}
var d={
AudioPlayer:函数(文件名、timeUpdateCallback、playbackDone){
document.write(“Audioplayer
”); 返回{ 播放:函数(){playbackDone&&playbackDone();} } } }; 试一试{ (功能音频管理器(章){ var me=这个; this.next=函数(){ document.write(“AudioManager下一步
”); } 功能段(){ var audioPlayer=新的d.audioPlayer('/test.mp3',函数(p){}, 函数(){ document.write('playbackdone
'); me.next(); } ); audioPlayer.play(); } 播放片段(); }) (); }捕获(e){ 文件。编写(e); }

而且它在Chrome、iPodtouch和iPad上都能正常运行。

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

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

在哪里创建AudioManager实例?什么调用内部函数
playsecgment()
?在哪里创建AudioManager实例?什么调用了内部函数
playsecgment()
?您好,请参阅上面的更新,它解释了这一区别。感谢您花时间回答+1。您好,请参阅我上面的更新,这解释了区别。感谢您抽出时间回答+1。