迭代與迭代器

迭代器推演

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章