Javascript最大调用栈
Javascript maximum call stack
本文关键字:调用 Javascript 更新时间:2023-09-26
大家好我为我的音乐播放列表创建了两个函数
- 转到下一个音乐
- 一个传入随机音乐
我知道我的代码不够干净和实用,但它工作得很好,
只有一个错误发生当我点击下一步,直到最后一个音乐6次在我的例子中,但当我点击随机,一个错误Uncaught RangeError:最大调用堆栈大小超出出现,不知道为什么,这是我的代码:
测试var array = {
0: {
"id" : 1,
"nom" : "Musique 1",
"durée" : "3m34"
},
1: {
"id" : 2,
"nom" : "Musique 2",
"durée" : "2m32"
},
2: {
"id" : 3,
"nom" : "Musique 3",
"durée" : "3m54"
},
3: {
"id" : 4,
"nom" : "Musique 4",
"durée" : "2m19"
},
4: {
"id" : 5,
"nom" : "Musique 5",
"durée" : "2m24"
},
5: {
"id" : 6,
"nom" : "Musique 6",
"durée" : "1m58"
}
};
var count = getObjectLength(array), itmsl = [], mus = -1;
function aleatoire(p){
var item = Math.floor(Math.random()*count);
mus = item;
if(itmsl.indexOf(item) < 0){
itmsl.push(item);
echo(array[item]);
}else{
aleatoire();
}
if(itmsl.length >= count){
itmsl = [];
}
}
function suivant(){
mus++;
if(itmsl.indexOf(mus) < 0 && typeof array[mus] !== 'undefined'){
itmsl.push(mus);
echo(array[mus]);
}else{
mus = -1;
itmsl = [];
suivant();
}
}
function echo(str){
if(typeof str != "undefined"){
console.log(str);
}else console.log('error');
}
function getObjectLength(obj){
var length = 0;
for ( var p in obj ){
if ( obj.hasOwnProperty( p ) ){
length++;
}
}
return length;
}
谢谢你的帮助
函数suivant()
既不接受参数也不返回值。因此,在我看来,它是无用的递归(递归的全部要点是使用调用堆栈来管理您的数据存储,但您似乎已经使用数组手动管理它)。这样写的唯一原因似乎是为了模仿goto
。
因此,将其更改为while
循环(当然只是goto的另一种形式)非常简单:
function suivant(){
var end = 0;
while (!end) {
mus++;
if(itmsl.indexOf(mus) < 0 && typeof array[mus] !== 'undefined'){
end = 1;
itmsl.push(mus);
echo(array[mus]);
}else{
mus = -1;
itmsl = [];
}
}
}
同样,函数aleatoire
也应该是迭代的:
function aleatoire(){
var end = 0;
while (!end) {
var item = Math.floor(Math.random()*count);
mus = item;
if(itmsl.indexOf(item) < 0){
end = 1;
itmsl.push(item);
echo(array[item]);
} else {
// don't end
}
if(itmsl.length >= count){
itmsl = [];
}
}
}
如果将递归终止符移到顶部,它应该可以正常工作。在您的aleatoire方法中,将此代码移到顶部。一旦你这样做了,你就完全不需要递归了,并且可以安全地注释掉else
function aleatoire(){
if(itmsl.length >= count){
itmsl = [];
}
var item = Math.floor(Math.random()*count);
mus = item;
if(itmsl.indexOf(item) < 0){
itmsl.push(item);
echo(array[item]);
}
//else{
// aleatoire();
// }
}
相关文章:
- 我需要从php调用javascript或jquery
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- 使用html表单中的参数调用JavaScript函数
- 可以´t调用JavaScript中的函数
- 在按钮上调用Javascript函数
- 如何从Objective-C代码中调用javascript代码
- 当库在页脚中加载时,基于PHP条件调用Javascript
- 可以't在Jasmine中调用Javascript函数
- 在page_load事件上调用javascript函数
- 如何在ajax中调用javascript对象的方法
- 如何使用WPF调用JavaScript对象的函数
- 我们可以用参数对象集合而不是原始数据来调用JavaScript collection.reduce()方法吗
- 在新的浏览器选项卡上加载新的aspx页面后调用JavaScript函数
- 从附加文本调用javascript(订单车)
- 在线程循环中调用JavaScript
- 在指定时间后多次调用Javascript中的函数
- 未调用Javascript onscroll事件
- 如何正确调用Javascript中的匿名函数
- 从字符串调用javascript函数
- 无法从活动调用 javascript 函数