Javascript 将参数传递到setTimeout:一个方法不起作用(JS)

Javascript 将参数传递到setTimeout:一个方法不起作用(JS),javascript,arguments,Javascript,Arguments,我正在研究如何将参数传递到setTimeout(如建议的那样) 在激活HTML5音频元素的while循环上下文中 这项工作: window.setTimeout(playTone, time, phrasePitches[x]); 奇怪的是,这不起作用: window.setTimeout(function(){ playTone(phrasePitches[x]); }, time); 在控制台中,超时按计划发生,每个超时显示: TypeError:无法将属性“currentTim

我正在研究如何将参数传递到setTimeout(如建议的那样) 在激活HTML5音频元素的while循环上下文中

这项工作:

window.setTimeout(playTone, time, phrasePitches[x]);
奇怪的是,这不起作用:

window.setTimeout(function(){
    playTone(phrasePitches[x]);
}, time);
在控制台中,超时按计划发生,每个超时显示:

TypeError:无法将属性“currentTime”设置为null

因此,出于某种原因,第二个方法不希望接受数组。。。知道这是怎么回事吗

编辑。。。完整代码:

function playTone(tone){
        var tone = document.getElementById(tone);
        tone.currentTime = 0;
        tone.play();
    };

var pitchSet = new Array ("C3","D3","E3","F3","G3","A3","B3","C4");

fyshuffle (pitchSet);  // The Fischer-Yater shuffle function
    var i = 0;
    var phrasePitches = new Array();
    while (i < 4) { 
        phrasePitches.push(pitchSet[i]);
        i++; 
    }

var x=0;
var time = 0;
while(x<4){
//  window.setTimeout(playTone, time, phrasePitches[x]);  // This works.
    window.setTimeout(function(){
        playTone(phrasePitches[x]);
    }, time);
    time += 2000;
    x++;        
}
功能播放音调(音调){
var tone=document.getElementById(tone);
tone.currentTime=0;
音调。播放();
};
var pitchSet=新阵列(“C3”、“D3”、“E3”、“F3”、“G3”、“A3”、“B3”、“C4”);
fyshuffle(pitchSet);//Fischer-Yater洗牌函数
var i=0;
var phrasepitchs=新数组();
而(i<4){
短语pitchs.push(pitchSet[i]);
i++;
}
var x=0;
var时间=0;
while(xAudiosprites)
此演示使用audiosprite⁰. 我用这个程序把小的MP3文件连接成一个大的MP3文件✲. 然后我记下了每个片段的开始和结束时间(以秒为单位)。如果手动方式看起来很困难的话

✲ 我在创建audiosprite后发现了它,所以我还没有测试过它,但它看起来比Audacity更容易使用

详细信息在演示和参考资料对应的注释中进行注释

演示
//引用
var fx=document.querySelector(“#fx”);
/*引用(可以是具有
||结束标记:
*/
var panel=document.querySelector(“#panel”);
/*在数组对象中映射audiosprite的碎片
||每个阵列代表一个frag,由以下部分组成:
||“键”:[开始时间,结束时间]imk
||TODO:用ES6 Map²替换对象文字
*/
变量sprite={
“全部”:[0,27],
“单击”:[0,45],
"钟":[65,7.4],,
“电梯”:[7.5,9.7],
“声纳”:[10,27]
};
//声明结束时间的默认值
var-end=0;
//在loadeddata事件中注册。。。
fx.addEventListener('loadeddata',函数(e){
/*链接到.forEach()的Object.keys⁴ 迭代
||“精灵”属性(键/值对)。
*/
Object.keys(精灵).forEach(函数(键,索引){
/*在每次迭代中,在
|| 
||注意模板文本的使用⁵
||待办事项:代表⁶ 单击要避免的事件面板
||内联属性事件处理程序
*/
panel.innerHTML+=`${key}`;
});
},假);
//注册on-timeupdate事件⁷...
fx.addEventListener('timeupdate',函数(e){
/*播放位置更改时发生时间更新
||检查当前时间是否正确⁸ 性质
||大于“end”的值
||('end'是frag:sprite[key][1]的第二个值)
||如果是,请暂停
*/
如果(fx.currentTime>结束){
暂停();
}
},假);
/*此函数传递“key”的字符串值
||在精灵对象中
||每个“键”都有一个数组的值,该数组包含一个起始值
||时间和结束时间。
||简而言之,“key”指的是frag。
*/
功能效果(关键){
//如果“精灵”对象中的“键”存在。。。
if(精灵[键]){
/*当前的时间是
||“key”的第一个值
*/
fx.currentTime=sprite[key][0];
//将“key”的第二个值指定给“end”
结束=精灵[键][1];
/*玩
||请注意,如果按照惯例由
||将每次更改的.src重新加载到单独的
||需要调用frag、fx.load()
||同时,也会引发另一个HTTP请求
*/
fx.play();
}
}

影响

我打赌这与此有关。你能发布关于
setTimeout
定义的代码吗(我只对循环感兴趣,如果有)。它似乎没有“currentTime”在你的代码中。它在名为PlayTone的函数中吗?也许你应该显示代码。这肯定是我在上面的评论中提到的问题。当超时执行回调时,
x
将等于数组的长度,因为
array[array.length]
未定义的
,如果您尝试访问
未定义的
属性,将引发错误。我最喜欢的重复链接回答是:将代码包装在
中,而在立即调用的函数表达式中
循环…@zerOOne…很好!太棒了,谢谢!我肯定会使用这个概念沿着这条路走。你在这里编写了一个很棒的教程,你应该把它写在某个地方:)@GregoryTippett谢谢你,先生。如果它通过单击✔. 快乐编码。