Javascript 在桌面浏览器和移动safari上处理闭包的方式不同?
下面是一个简单的javascript程序: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;
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。