理解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就可以了,为了防止全局变量污染,可以采用闭包的方式。

浙公网安备 33010602011771号