递归函数js,js的promise如何递归调用?
递归函数js,js的promise如何递归调用?详细介绍
本文目录一览: js递归通俗的理解
function recursion(x){
if(x>0){
document.write(x+'
');
recursion(x-1);
}
}
recursion(10);
这就是递归。
就是函数里再调用函数
所谓的递归函数就是在函数体内调用本函数。使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题下面做一个10以内的阶乘试试看:
function fact(num){ if (num<=1){ return 1; }else{ return num*fact(num-1); }}
JS递归的常见用法
求 1-100 的和
1,1,2,3,5,8,13,21,34,55,89...求第 n 项
JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法
原理: clone(o) = new Object; 返回一个对象
1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。
5、递归实现的快速排序比普通遍历实现的排序效率更好。
javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方
function Run(json,path){
var value;
if(path.length<=1){
value=json[path[0]]; // 如果这里换成var value=json[path[0]]结果是undefined
}
else {
json = json[path[0]]; //这里为什么不能用 json=json[path[0]]
path.splice(0,1);
value = Run(json,path);
}
return value;
}
======================
看一下你写的函数,参数mypath有两个以上元素,走else分支的时候value没有赋值,当然是undefined。
这个问题貌似用不到递归,楼主试下这个:
1:value是局部变量那么它的作用域只存在于if(path.length){}中,外面是取不到的所以你的return肯定是undefined,局部变量是好习惯,避免全局污染,效率还比较高,这里你可以在function Run里先声明下,方法内就可以使用了。
2:梳理了你的逻辑,第一处注释和上面的问题是一样的,第二处注释json=json[path[0]]这个写法本身没有错误,这里应该存在书写上或修改后逻辑上的错误。
3:首先要明白对象是存在栈里面的,也就是直接存值,变量是地址赋值,也就是引用赋值(存在堆里面),这是javascript的规定用于复用达到节省内存开销的作用,类似于C指针的概念。如果你需要值赋值,那么请直接找关于javascript克隆的方法。
4:建议你还是了解下基础,多耐心些,有时候长期面对代码,脑袋会范木,缓缓心情,自然是水到渠成。
递归经常碰到的问题了。
出问题的地方是 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);
javascript函数怎么自己调用自己啊?
自己调用自己,就是递归var i = 0;function asd () { i++; if (i == 3) return; asd();}asd();alert(i);
自己调用自己的函数叫做递归函数,递归函数是在程序中函数直接或间接调用自己。
工具原料:编辑器、浏览器
1、简单的JavaScript递归代码示例如下:
function test(num){ if(num <= 1){ return 1; }else{ return num * test(num-1); }}var a = test;console.log(a(6)); // 12、运行的结果如下:
JS递归函数求[1,[2],[3,[4]]] 返回值为[1,2,3,4]
var yugi = function(arr, result) { for(var i=0;i
<arr.length;i++){ var tmp="arr[i];" if(tmp.join){ yugi(tmp, result); }else{ result.push(tmp); } }}var result="[];yugi([1," [2], [3, [4]]], result);console.log(result);
js的promise如何递归调用?
好问题,正中Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容
也就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可。
一.定义 promise是对异步编程的一种抽象。它是一个代理对象,代表一个必须进行异步处理的函数返回的值或抛出的异常。也就是说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关于递归里的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
JS函数式编程和递归探索:路由树的操作
开始切入正题之前,有必要告知大家一下,这篇文章可能有一些深度,初学者可能理解会有些吃力。我会尽量把复杂问题简单化,争取让每个阅读的童鞋们都能看得懂。希望你对element-ui,vue-router,KeepAlive组件有一点了解。现在,我们开始吧。
熟悉element-ui的童鞋们都知道,ElMenuItem和ElSubMenu都需要一个index属性,该属性必须是唯一的。现在,我们想把路由配置直接应用于ElMenu,该如何确保index的唯一性呢?我们需要有一个生成唯一index的函数。如下是genKey函数的定义,是不是很简单?
现在,我们创建addRouteMetaKey函数,该函数对路由树进行递归遍历,为每一个路由配置的meta属性动态添加key字段。这个函数很简单,属于最基础的递归使用例子,我就不做太多解释了。
提示 :数组的forEach方法不是纯函数,因为它有副作用,所以forEach方法不能称之为函数式编程工具。
通过addRouteMetaKey函数,我们可以把路由的meta.key作为index的值了。
现在,我们想实现另一个功能,就是 基于标签页的路由组件缓存控制 。使用过Vuejs KeepAlive组件的童鞋们,应该多多少少都遇到一些坑吧?在我们的项目中,有一个顶部标签页导航,每个tab项对应一个url,以每个url对应路由的title作为tab项标题,当切换tab的时候加载缓存中的url对应的路由组件,关闭tab项,下次打开该路由url,重新挂载对应的路由组件,而不是从缓存中加载。
当路由层级不确定的时候,KeepAlive会变的难以手动控制。所以,我 剑走偏锋,尝试了一种简单的解决方案 ,实践证明: 这是非常有效的 。我的方案就是把无限层级的路由树转化为一维数组。通过为meta添加必要的字段,进行页面结构个性化定制。
我们需要把每层路由配置的path转化为全路径,所以需要一个函数:getRouteFullPath,该函数定义如下:
getRouteFullPath函数中使用到的joinPath函数用于将多个路径字符串拼接为1个完整的路径,定义如下:
现在,我们把路由树转化为一维数组。我们定义toFlatRoutes函数,该函数使用了数组的reduce方法对路由树进行聚合递归,将路由配置中的path属性的值替换为全路径,还顺便给路由配置添加了name属性,返回一个新的一维路由配置数组。 这是函数式编程和递归结合的一个例子。
以上,我们解决了KeepAlive的缓存控制问题;现在,我们又有了一个新的用户体验上的需求,就是我们想根据url对应的路由,自动展开该路由meta.key所属的侧边菜单;我们通过查阅element-ui文档得知,ElMenu有一个open方法,接收index作为参数,展开index对应的菜单。
现在的问题是,我们的路由对应的index是ElMenuItem的,而路由树已经被我们转化为了一维数组,通过路由的matched字段是得不到我们想要的菜单index的。所以, 我们需要遍历原始路由树 。
如下代码,我们定义getMenuKey函数,该函数接收的参数为route对象。如果路由存在,我们进行查找。首先进行简单查找,如果找到一个菜单menu,则返回该菜单的meta.key;如果简单查找无果,则对路由树进行递归查找; 这是函数式编程和递归结合的另一个例子。
现在,我们大功告成了;以上就是本节的知识点,童鞋们理解了吗?只要我们熟悉递归的使用,其实操作树很简单。如果大家还有不懂的,可以评论区问我。感谢阅读!
javascript如何递归赋值
a1=100;a2=a1+100;a3=a2+100;....
var a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;// 递归赋值setval(1, 100);// 打印验证document.write('打印验证:
');for (var i=1;i<=10;i++) { document.write('a'+i+' = '); eval('document.write(a'+i+')'); document.write('
');}function setval($var_i, $var_val) { if ($var_i > 10) return false; eval('a' + $var_i + ' = ' + $var_val + ';'); $var_i ++; $var_val += 100; setval($var_i, $var_val);}