[英]closures handled differently on desktop browser and mobile safari?
这是一个简单的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音频标签,因此我没有遇到这个问题。
您正在使用哪个版本的移动浏览器?
我因此捕获了代码的本质:
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上正常运行。
我没有提到audioPlayer依赖于PhoneGap的媒体类。 在其回调中不接受闭包。 问题在于,回调函数以字符串形式存储在本机代码中,因此返回时,引用已消失。 对于台式机浏览器,我实际上使用的是HTML5音频标签,因此我没有遇到这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.