迭代器推演

1. 一般函数

var func = function(){
    console.log("func执行了");
    return 123;
}

console.log(func());    //函数返回值123;
console.log(func);  //返回的是func的地址

2. 传参函数

var func = function(a){
console.log("func执行了,收到参数:",a);
    return 123;
}
console.log(func(1));   //函数返回值123;

3. 尝试用for来让函数循环执行

var func = function(a){
    console.log("func执行了,收到参数:",a);
    return 123;
}

for(i=1;10;1){
    var v = func(i);
    console.log(v);
}   //将执行语句移动到循环语句内

4. 改动一下for循环:迭代

var func = function(a){
    console.log("func执行了,收到参数:",a);
    return 123;
}
//v是func函数返回值,可以有多个返回值,但是只会返回第一个
for(v in func){     //func()的()要删掉,不然报错
    console.log(v);
}       //这里会循环执行不会停!

5.指定第一次执行参数

var func = function(a){
    console.log("owner:",owner)
    console.log("func执行了,收到参数:",a);
    console.more(1);
    return 123;
}
//1:owner参数,2才是第一个调用参数
for(v in func,1,2){     //onwer参数一般用不到可以留空省略
    console.log(v);
}
//这里也会不停的执行

运行一下可看到第一次收到参数是2,第二次开始的参数就是前一次func函数返回值123。

6. 让迭代器返回null来结束循环

var func = function(a){
    console.log("func执行了,收到参数:",a);
    a++;
    if(a<=10){
        return a; 
    }
    else{
        return null;
    }
}

for(v in func,,1){      //这里的()要删掉,不然报错
    console.log(v);
}

7. 再用一个函数表示func,,1

var iter = function(){
    return func,,1;
}
for(v in iter()){       //这里需要(),细细体会!!!
    console.log(v);
}

8. 函数名也是一个变量,把func放到iter里面:

var iter = function(){
    var func = function(a){
        console.log("func执行了,收到参数:",a);
        a++;
        if(a<=10){
            return a; 
        }
        else{
            return null;
        }
    }   
    return func,,1;
}

for(v in iter()){       
    console.log(v);
}

9. iter是一个函数,可以接收变量,这里把迭代器for循环次数改为变量

var iter = function(len){
    var func = function(a){
        console.log("func执行了,收到参数:",a);
        a++;
        if(a<=len){
            return a; 
        }
        else{
            return null;
        }
    }   
    return func,,1;
}

for(v in iter(15)){     
    console.log(v);
}

10. 再优化,把循环初始值也改成变量

var iter = function(i,len){
    var func = function(a){ //a是迭代器的控制变量
        console.log("func执行了,收到参数:",a);
        a++;
        if(a<=len){
            return a; 
        }
        else{
            return null;
        }
    }   
    return func,,i;
}
//创建迭代器的函数(生成器)
for(v in iter(2,15)){       
    console.log(v);
}

总结:迭代器分离了业务和逻辑的代码,实现代码模块化,降低代码耦合度。

一个函数,调用函数,会返回函数内部的功能实现。函数的return则是得到返回值,是函数执行后的值,直接输出函数,是函数对象本身的内存地址。使用变量的时候,尽可能的使用局部变量,因为局部变量作用域受限,所以速度会快一些。


迭代:

函数中包函数,把上一次执行这个函数的返回值作为输入。即总是把上一次取得的成果,作为下一次执行的参数,或者是下一次执行的成本。这就是一个循环取值并不断逼近目标的工作。用于做迭代的函数,叫做迭代器。

在迭代器内的函数,放的是函数本身,上一次执行的结果,是下一次的参数,那么第一次执行的时候,参数是什么呢?。如果要给这个函数传参,要求在函数后面用逗号隔开,然后每个参数一个逗号。但是,第一个参数,是内函数的owner,代表外面的迭代器要调用哪个函数。所以,第一个参数是owner参数,一般可以不写。“func,,2,3”

当一次迭代过程中,func中return的是一个null,则停止迭代。控制迭代参数

迭代器可以在函数间传递交换代码控制权,分离代码逻辑,便于更好的模块化代码。

迭代器的生成器的函数名一般以‘each’开始,例如com.each()/table.eachName/process.each()/string.gmatch()