登录  /  注册
首页 > web前端 > js教程 > 正文

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

不言
发布: 2018-07-13 17:33:10
原创
2744人浏览过

这篇文章主要介绍了关于如何解决vue中methods中的方法闭包缓存的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

vue中methods中的方法闭包缓存问题

问题背景

需求描述

  • 在路由的导航栏中需要, 判断是否为第一次点击

  • 需要一个标志位来记录是否点击过

  • 现状:

    • 这个标志位只在一个函数中用过.不希望存放全局

    • 希望在这个methods中形成闭包, 用来缓存这个函数

    • 做出如下尝试后, 发现可以实现.

  • 当前问题:

    • 不能在闭包调用时找到正确的this.

诡异点

  • 测试使用时: 返回的this找到了window

// 测试使用:
  <p>
    <button>测试按钮</button>
  </p>
  <script>
    var app = new Vue({
      el: &#39;#app&#39;,
      methods: {
        test: (() => {
          `use strict`
          console.log(this) // Window
          var flag = true
          return () => {
            console.log(this) // Window
            flag = false
          }
        })()
      }
    })
  </script>
登录后复制
  • 实际项目中的this变成了undefined

3764058805-5b45e8cbbb8a6_articlex[1].jpg

  • 更加诡异的是debugger之后, 我们一步步来看

  • 当前代码:

    pointJump: (() =&gt; {
      let isFirstChanged = false;
      console.log(this);
      debugger;
      return entry =&gt; {
        console.log(this);
        console.log(isFirstChanged);
        debugger;
        isFirstChanged = true;
      };
    })(),
登录后复制
  • 操作:

  1. 刷新页面, 第一次函数立即执行2400994159-5b45e8cbcbcca_articlex[1].jpg

  2. 页面生成完成后: 我们再次通过按钮触发事件: 此时debugger显示内存中为Vue的顶级对象, 而在控制台打印出来的依旧是undefined

1916631644-5b45e8cbc5236_articlex[1].jpg

2300597947-5b45e8cbb758c_articlex[1].jpg

执行过程分析

  • 第一次执行的时候为undefined是正常的, 因为第一次闭包执行, 没有找到this

  • 当我们再次执行的时候, 虽然调用起来的上下文, 也就是this已经改了, 但是因为在作用域中那个this所代表的空间还是undefined, 所以没有能改变过来.

  • 就造成了我们所看到的诡异的现象.

与测试文件有差别的原因

  • 因为在测试环境下, 没有能开启严格模式.

  • 经过两次不同位置的的开启尝试, 都不对

  • 依旧可以找到window对象

  • 现在推测是在vue内部进行的实现, 因为引入的vue版本不同.需要再进行测试, 看来源码还是要好好过一遍

  <script>
    var app = new Vue({
      el: &#39;#app&#39;,
      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 = (() =&gt; {
  let aaa = true;
  return function () {
    console.log(this);
    aaa = false;
  };
})();
mainJump(entry) {
  test.call(this);
},
登录后复制

解决方法

  • 形成闭包返回的函数中, 不要使用箭头函数, 使用function定义即可

    pointJump: (() =&gt; {
      let isFirstChanged = false;
      return function () {
        console.log(this); // Vue的顶级对象
        isFirstChanged = true;
      };
    })(),
登录后复制

总结

  • 箭头函数不会被call, bind等方法改变this指向

  • 在闭包中返回函数, 缓存变量时, 使用function进行返回函数的定义.

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Vue2.0自定义指令与实例的属性和方法

Vue中父子组件间的通信

以上就是如何解决vue中methods中的方法闭包缓存的问题的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号