表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. 大部分的递归, 遍历, 迭代, 都是循环.
递归是重复调用函数自身实现循环。
迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
迭代,重复一定的算法,达到想要的目的。数学上二分法,牛顿法是很好的迭代例子
function iteration(x){
var sum=1;
for(x; x>=1; x--){
sum = sum*x;
}
}
迭代式开发:迭代式开发应该是取自"迭代(数学)"的概念的, 意思是把开发过程划分成若干个小目标, 对每个小目标单独进行设计, 开发, 测试, 逐步地完成整个项目. 而传统的开发过程是纯线性的, 先统一设计, 再统一编码, 再统一测试. 相比于传统开发过程, 迭代式开发更灵活, 能够适应需求的变更, 及时验证设计的可行性等等的...
迭代开发更接近循环的意思,是指多次按照开发,测试,发布这样的周期循环来完成一个软件产品的最终发布。而不是试图一次性完成所有工作,发布最终版本
回调:
定义:把函数当做参数传递到另一个函数内部去调用,就叫回调。
应用场景:用于导航栏,当我们点击链接是才开始加载资源,避免同时加载多个资源,占用大量空间造成卡顿。
举例:
function request(fn){//这里的fn就相当于showCar、showWomen
console.log("发送网络请求");
setTimeout(function(){
console.log("得到请求数据");
fn();//相当于showCar();、showWomen();
},(Math.random()*3+1)*1000);
}
function showWomen(){
console.log("把女人展示在HTML上");
}
function showCar(){
console.log("把汽车展示在HTML上");
}
request(showWomen);
request(showCar);
结果如下:
递归:
定义:在函数的内部调用自身就是递归。
应用场景:快速排序。
举例:①打印数字1~10;
var i =10;
function test(){
var a = i--;
if(i<0){
return;
}
test();
console.log(a);//结果为2~10
}
test();
②实现1~n的累加:
function add(num){
if(num<=1){
return 1;
}
return num+add(num - 1);
}
var res = add(100);
console.log(res);
注意:区分回调和递归,回调是一个函数把自身外部的函数当做参数传递到自身内部来调用;而递归是自己调用自己。
总结:函数内部定义函数----闭包
函数内部调用其他函数----函数调用
函数内部调用参数传过来的函数----回调函数
函数内部调用自己这个函数----递归
循环(loop) - 最基础的概念, 所有重复的行为
递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况
(数学)迭代(iterate) - 在多次循环中逐步接近结果
(编程)迭代(iterate) - 按顺序访问线性结构中的每一项
遍历(traversal) - 按规则访问非线性结构中的每一项
这些概念都表示“重复”的含义, 彼此互相交叉,
闭包 : 有权访问另一个函数作用域中的变量的函数(定义在一个函数内部的函数)
function add(num1,num2){
return function doAdd(){
return num1+num2;
};
}
var r = add(1,2);
var result = r();
alert(result);
//或者调用方式如下
var result = add(1,2)();
alert(result);
/*****************************/
function test(){
var i = 100;
function t(){
alert(i);
function t2(){
alert("disanceng");
}
return t2;
}
i++;
return t;
}
test()()(); //这样调用才使得内层函数执行, 注意如果函数内 return t2(); return t(); 那么执行 test();就可以了./***** 闭包案例 ********/
var name = 10;
var obj = {
name:"hello",
fn:function(){
return function(){
retrun this.name;
}
}
};
alert(obj.fn()()); //结果是10, 因为闭包内的 this 是全局 window 的,若想调用obj.name 下面这个案例
var name1 = 10;
var obj1 = {
name : "obj-name",
fn : function(){
var t = this;
return function(){
retrun t.name;
}
}
};
alert(obj1.fn()()); //结果就是 obj-name