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()