您好,欢迎访问一九零五行业门户网

如何解决vue中methods中的方法闭包缓存的问题

这篇文章主要介绍了关于如何解决vue中methods中的方法闭包缓存的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
vue中methods中的方法闭包缓存问题问题背景需求描述在路由的导航栏中需要, 判断是否为第一次点击
需要一个标志位来记录是否点击过
现状:
这个标志位只在一个函数中用过.不希望存放全局
希望在这个methods中形成闭包, 用来缓存这个函数
做出如下尝试后, 发现可以实现.
当前问题:
不能在闭包调用时找到正确的this.
诡异点测试使用时: 返回的this找到了window
// 测试使用:  <p id="app">    <button @click="test">测试按钮</button>  </p>  <script>    var app = new vue({      el: '#app',      methods: {        test: (() => {          `use strict`          console.log(this) // window          var flag = true          return () => {            console.log(this) // window            flag = false          }        })()      }    })  </script>
实际项目中的this变成了undefined
更加诡异的是debugger之后, 我们一步步来看
当前代码:
pointjump: (() => {      let isfirstchanged = false;      console.log(this);      debugger;      return entry => {        console.log(this);        console.log(isfirstchanged);        debugger;        isfirstchanged = true;      };    })(),
操作:
刷新页面, 第一次函数立即执行
页面生成完成后: 我们再次通过按钮触发事件: 此时debugger显示内存中为vue的顶级对象, 而在控制台打印出来的依旧是undefined
执行过程分析第一次执行的时候为undefined是正常的, 因为第一次闭包执行, 没有找到this
当我们再次执行的时候, 虽然调用起来的上下文, 也就是this已经改了, 但是因为在作用域中那个this所代表的空间还是undefined, 所以没有能改变过来.
就造成了我们所看到的诡异的现象.
与测试文件有差别的原因因为在测试环境下, 没有能开启严格模式.
经过两次不同位置的的开启尝试, 都不对
依旧可以找到window对象
现在推测是在vue内部进行的实现, 因为引入的vue版本不同.需要再进行测试, 看来源码还是要好好过一遍
<script>    var app = new vue({      el: '#app',      methods: {        test: (() => {          `use strict`          console.log(this) // window          var flag = true          return () => {            console.log(this) // window            flag = false          }        })()      }    })  </script>
最后找到原因的测试因为箭头函数的this是不会改变, 拥有根据父级能够返回的this
然后因为上面的闭包环境中的this, 指向的一直都是undefined
const test = (() => {  let aaa = true;  return function () {    console.log(this);    aaa = false;  };})();mainjump(entry) {  test.call(this);},
解决方法形成闭包返回的函数中, 不要使用箭头函数, 使用function定义即可
pointjump: (() => {      let isfirstchanged = false;      return function () {        console.log(this); // vue的顶级对象        isfirstchanged = true;      };    })(),
总结箭头函数不会被call, bind等方法改变this指向
在闭包中返回函数, 缓存变量时, 使用function进行返回函数的定义.
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注!
相关推荐:
vue2.0自定义指令与实例的属性和方法
vue中父子组件间的通信
vue中eventbus的解析
以上就是如何解决vue中methods中的方法闭包缓存的问题的详细内容。
其它类似信息

推荐信息