zoukankan      html  css  js  c++  java
  • 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:

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

    请注意上面:"var next=setup(data);"  得到的是setup函数返回的匿名函数体并不是匿名函数的调用,在函数中,通过函数名调用函数不加后面的小括号得到的只是函数本体,并不会执行调用函数的方法,只有加上小括号才会进行调用。接下来:"next()" 才是真正的调用setup中的匿名函数。这里先将next存为变量是为了将数组参数传递给setup方法进行保存。

    最后,通过上面的方法我们来写一个迭代器轮询数组中的元素(最近公司需要做一个楼盘数据实时展示的功能运用了此方法),文章写的比较简单如果有错误或什么疑问欢迎留言:

    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);
  • 相关阅读:
    设计模式-行为型模式,python备忘录模式
    设计模式-行为型模式,python 中介者模式
    python 迭代器模式
    python对象池模式
    设计模式-结构型模式,python组合模式
    设计模式-结构型模式,python桥接模式
    python concurrent.futures.Threadpoolexcutor的有界队列和无界队列
    python加快数据处理的方法
    面向切面编程AOP,一些通用装饰器
    supervisor的command执行两条命令
  • 原文地址:https://www.cnblogs.com/l000/p/9055146.html
Copyright © 2011-2022 走看看