理解js闭包

  所谓闭包,个人理解为读取其他函数私有变量的函数,意思是我可以在函数的外部获取到该函数内部的变量。

  



mounted () {
  that.ready();
},

methods: {

    ready() {
      var that = this;
      var revaSwiper = new Swiper('.preview-right .swiper-        container', {
          effect : 'coverflow',
          slidesPerView: 1.2,
          centeredSlides: true,
          slideToClickedSlide:true,
          coverflow: {
            rotate: -1,
            stretch: 10,
            depth: 60,
            modifier: 2,
            slideShadows : false
          },
          onSlideChangeStart: function(swiper){
            slideRevaIndex(swiper.activeIndex);
          }
      });
      function slideRevaIndex(num) {
        that.revaActive = num + 1;
      };
      var appSwiper = new Swiper('.app-preview .swiper-container', {
          effect : 'coverflow',
          slidesPerView: 2,
          centeredSlides: true,
          initialSlide :2,
          slideToClickedSlide:true,
          coverflow: {
            rotate: -1,
            stretch: 66,
            depth: 80,
            modifier: 3,
            slideShadows : false
          },
          onSlideChangeStart: function(swiper){
              slideAppIndex(swiper.activeIndex);
          }
      });
      function slideAppIndex(num) {
        that.appActive = num;
      };
      return function () {
        return {
          reva: revaSwiper,
          app: appSwiper
        };
      };
    },
    slideReva(num) {
      let reva = this.ready()().reva;
      reva.slideTo(num - 1, 1000, false);
      this.revaActive = num;
    },
    slideApp(num) {
      let app = this.ready()().app;
      app.slideTo(num, 1000, false);
      this.appActive = num;
    }
  }  


上面的代码是我在一个Vue项目中使用swiper轮播插件时实际使用到的闭包:el被新创建的vm.$el替换并挂载到实例上去之后 执行ready函数渲染swiper插件,到这一步一切正常;接下来问题来了,我在页面端定义了几个按钮来切换轮播的页面,方法是slideReva 和 slideApp,现在在这两个函数中我需要获取到ready()中的变量revaSwiper和AppSwiper然后调用它们的slideTo方法来完成页面切换,业务逻辑到此结束。

实现方法:在ready函数尾部return一个function ,函数内部return一个对象来装载我所需要的两个变量,在slideReva 和 slideApp 中调用ready函数并执行内部return的函数,这样我就得到了ready内部的两个变量revaSwiper和AppSwiper,然后对这两个变量进行我需要的操作。

  当然,如果不使用闭包也可以实现:定义两个全局变量,在ready执行的之后将revaSwiper和appSwiper两个函数内部的变量赋予全局变量a和b,在下面的函数中直接引用全局变量a和b就可以了,为了防止全局变量污染,可以采用闭包的方式。
posted @ 2017-02-15 16:32  web_captian  阅读(237)  评论(0)    收藏  举报