迭代器推演
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()