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);
相关文章
相关标签/搜索