⑴ js递归通俗的理解
所谓的递归函数就是在函数体内调用本函数。使用递归函数一定要注意回,处理不当就会进入死循环。递答归函数只有在特定的情况下使用 ,比如阶乘问题
下面做一个10以内的阶乘试试看:
functionfact(num){
if(num<=1){
return1;
}else{
returnnum*fact(num-1);
}
}
⑵ js关于递归里的return
首先看题主的代码,按照要求,去掉函数中最后一个 return
首先 调用回 total(9),这时 total中 i 的值为答 9, 然后执行 if 条件 i % n == 0 (9 % 1 == 0),结果为true,进入执行 sum = sum+n,然后执行 n++ (n = 2);然后执行 if 条件 n > i ( 2 > 9),结果为 false,跳过 if, 执行下一步 total(i)
问题就出现在这里,执行第一层的时候 total 函数并没有返回值,当total 进入最后一层循环的时候,即便是返回了 sum, 因为前面的几层并没有返回,所以最后结果就会是 undefined
所以,想要最终有结果返回,即便是递归,也得保证层层有 return
⑶ javascript 递归,根据index 取出name
functiontest2(data,index){
varresult,temp;//返回值和临时变量
for(variindata){
temp=data[i];
if(temp['name']&&temp['index']==index){
result=temp['name'];
break;//如果已经返回了就中止
}
//如果还没有找到则遍历menus参数专下属的数据
if(typeofresult=='undefined'&&temp['menus']){
result=test2(temp['menus'],index);
}
}
returnresult;
}
⑷ js的promise如何递归调用
递归是Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容,也就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可
举例如下:
//假如用jQuery
function get(url, p) {
return $.get(url + "?page=" + p)
.then(function(data) {
if(!data.list.length) {//递归结束条件
return [];
}
return get(url, p+1)//递归调用
.then(function(nextList) {
return [].concat(data.list, nextList);//合并递归内容
});
});
}
get("urlurl", 1).then(function(list) {
console.log(list);//your full list is here
});
⑸ JS递归函数求[1,[2],[3,[4]]] 返回值为[1,2,3,4]
varyugi=function(arr,result){
for(vari=0;i<arr.length;i++){
vartmp=arr[i];
if(tmp.join){
yugi(tmp,result);
}else{
result.push(tmp);
}
}
}
varresult=[];
yugi([1,[2],[3,[4]]],result);
console.log(result);
⑹ javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方
递归经常碰到的问题了。
出问题的地方是 Run(temp,path);
既然是递归的调用 而且这个函数本身 有 return 值 那么 你应该在
调用 Run(temp,path);的时候 接收他的返回值
应该写成 value = Run(temp,path);
1. 现在你可以设成 局部变量 var value 了。
之所以出现undefined就是因为
return value 这行代码 就执行了 1次 也就是 第一个执行 var test=Run(myjson,mypath);的时候
这个时候 value 变量还没有定义出来, value是在 最后一次执行 Run(temp,path);的时候才定义的,而需要把这个 返回出来 并接收 才有效。
2. json=json[path[0]],
这个地方 不会报错 你是写错了代码
你如果 把这个地方 写成 json=json[path[0]],
那么下面 Run(temp,path); 是不是也应该写成 Run(json,path);呢?
这样就不会报错。
3. 在javascript里 数组和 对象 都是属于 引用类型的, 这是为了 节省内存空间。
其实道理简单, var a = {b:1} 这个时候 a变量里面 存储的是 保存这个 对象的内存地址,
打个比方 这个对象是一个宝箱 他是隐藏在内存的, a变量里面是打开这个宝箱的钥匙和地图
那么 b=a的时候 只是 复制了 钥匙和地图, 宝箱还是一个, 所以这个时候 a 和b 是指同一个对象的。
最后代码 修改后是这样
function Run(json,path){
if(path.length<=1){
var value=json[path[0]]; // 如果这里换成var value=json[path[0]]结果是undefined
} else {
var temp;
json=json[path[0]]; //这里为什么不能用 json=json[path[0]]
path.splice(0,1);
value = Run(json,path);
//arguments.callee(temp,path);
}
return value;
}
var myjson={a:1,b:{c:{e:3},d:4}};
var mypath=['b','c','e'];
var test=Run(myjson,mypath);
alert(test);