javascript利用閉包實現迭代器輪詢數組中的元素

閉包:首先是全局做用域,在js中函數之外的做用域稱爲全局做用域,能夠包含各類變量和函數。每一個函數又會有一塊本身的做用域,用來存儲該函數私有的變量及函數,這稱爲局部做用域。全局做用域能夠訪問函數之外的一切變量及函數,但不能訪問函數內私有的變量,若是咱們想從外面訪問函數內部變量時,咱們能夠在函數內部定義一個子函數,這樣,子函數就能夠訪問父函數中的變量,當子函數訪問其父函數中的變量,此時就產生了一個閉包。數組

一般狀況下,咱們都知道如何利用循環來遍歷一個簡單數組,可是有時候咱們須要面對更爲複雜的數據結構,他們一般會有着與數組大相徑庭的序列規則,這時候須要將"下一個"的複雜邏輯封裝成易於使用的next()函數。數據結構

這裏定義一個函數,接受數組輸入的初始函數,咱們在其中定義了一個私有指針,該指針會始終指向數組中的下一個元素:閉包

function setup(x){
    var i=0;
    return function(){
        return x[i++];
    }
}

而後,用一組數據調用setup方法就會產生所須要的next()方法:函數

var data=['foo','bar','baz','goo'];
var next=setup(data);

下面,每次調用next方法時,就會獲得數組中的一個元素,當數組中的個數調用結束後在次調用就會獲得undefined:spa

next();  // foo
next(); // bar
next(); // baz
next(); // goo
next(); // undefined

請注意上面:"var next=setup(data);"  獲得的是setup函數返回的匿名函數體並非匿名函數的調用,在函數中,經過函數名調用函數不加後面的小括號獲得的只是函數本體,並不會執行調用函數的方法,只有加上小括號纔會進行調用。接下來:"next()" 纔是真正的調用setup中的匿名函數。這裏先將next存爲變量是爲了將數組參數傳遞給setup方法進行保存。指針

最後,經過上面的方法咱們來寫一個迭代器輪詢數組中的元素(最近公司須要作一個樓盤數據實時展現的功能運用了此方法),文章寫的比較簡單若是有錯誤或什麼疑問歡迎留言:code

function  iteratorHouse(array){
    var i=0;
    return function (){
        if(i<array.length-1){
            return array[i++];
        }else{
            i=0;
            return array[array.length-1];
        }
    }
}

var houseData=['樓盤1','樓盤2','樓盤3','樓盤4','樓盤5','樓盤6'];
var showHouse=iteratorHouse(houseData);

setInterval(function(){
    console.log(showHouse());
},10000);
相關文章
相關標籤/搜索