Вот простая программа на 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) вызывается обратный вызов для завершения воспроизведения, все работает нормально. Однако при использовании точно такого же javascript в iPhone Safari я вижу исключение «не удалось найти переменную me».
Почему существует разница в способах обработки замыканий? Есть ли способ обойти это?
Обновление: Я не упомянул, что audioPlayer использует медиа-класс PhoneGap; который не принимает замыкания в своих обратных вызовах. Проблема в том, что обратный вызов хранится в виде строки в собственном коде, поэтому, когда он возвращает, ссылка исчезает.
Для настольных браузеров я фактически использовал и аудио тег HTML5, поэтому я не обнаружил эту проблему.