博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue中methods中的方法闭包缓存问题
阅读量:6619 次
发布时间:2019-06-25

本文共 1404 字,大约阅读时间需要 4 分钟。

本人所有文章首发在博客园:

问题背景

需求描述

  • 在路由的导航栏中需要, 判断是否为第一次点击
  • 需要一个标志位来记录是否点击过
  • 现状:
    • 这个标志位只在一个函数中用过.不希望存放全局
    • 希望在这个methods中形成闭包, 用来缓存这个函数
    • 做出如下尝试后, 发现可以实现.
  • 当前问题:
    • 不能在闭包调用时找到正确的this.

诡异点

  • 测试使用时: 返回的this找到了window
// 测试使用:  
复制代码
  • 实际项目中的this变成了undefined

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

  • 当前代码:

pointJump: (() => {      let isFirstChanged = false;      console.log(this);      debugger;      return entry => {        console.log(this);        console.log(isFirstChanged);        debugger;        isFirstChanged = true;      };    })(),复制代码
  • 操作:
    1. 刷新页面, 第一次函数立即执行
    2. 页面生成完成后: 我们再次通过按钮触发事件: 此时debugger显示内存中为Vue的顶级对象, 而在控制台打印出来的依旧是undefined

执行过程分析

  • 第一次执行的时候为undefined是正常的, 因为第一次闭包执行, 没有找到this
  • 当我们再次执行的时候, 虽然调用起来的上下文, 也就是this已经改了, 但是因为在作用域中那个this所代表的空间还是undefined, 所以没有能改变过来.
  • 就造成了我们所看到的诡异的现象.

与测试文件有差别的原因

  • 因为在测试环境下, 没有能开启严格模式.
  • 经过两次不同位置的的开启尝试, 都不对
  • 依旧可以找到window对象
  • 现在推测是在vue内部进行的实现, 因为引入的vue版本不同.需要再进行测试, 看来源码还是要好好过一遍
复制代码

最后找到原因的测试

  • 因为箭头函数的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进行返回函数的定义.

转载地址:http://bsupo.baihongyu.com/

你可能感兴趣的文章
架构优化 - 应用,MQ Broker,业务处理分层
查看>>
3月第3周网络安全报告:被篡改.COM网站占74.3%
查看>>
Spring Security之用户名+密码登录
查看>>
java JSplitPane设置比例
查看>>
批量操作Windows域用户
查看>>
shell脚本 接受用户参数 记录一下
查看>>
健脾祛湿的中成药有哪些?
查看>>
IIS下支持下载.exe文件
查看>>
CXF WebService Hello World
查看>>
市场调研报告:企业级信息防泄漏大趋势
查看>>
济南企业短信平台的价格如何?
查看>>
requirejs
查看>>
php printf() 输出格式化的字符串
查看>>
VS2013下的64位与32位程序配置
查看>>
浅谈C中的指针和数组(二)
查看>>
SSM+Maven+IDEA增删改查
查看>>
微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint:
查看>>
2001年日语能力考试二级真题及答案
查看>>
移动端页面布局
查看>>
FUNCS.H中的函数声明
查看>>