当前位置: 首页 > news >正文

data闭包 vue_vue中methods中的方法闭包缓存问题

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

问题背景

需求描述

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

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

现状:

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

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

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

当前问题:

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

诡异点

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

// 测试使用:

测试按钮

var app = new Vue({

el: '#app',

methods: {

test: (() => {

`use strict`

console.log(this) // Window

var flag = true

return () => {

console.log(this) // Window

flag = false

}

})()

}

})

实际项目中的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版本不同.需要再进行测试, 看来源码还是要好好过一遍

var app = new Vue({

el: '#app',

methods: {

test: (() => {

`use strict`

console.log(this) // Window

var flag = true

return () => {

console.log(this) // Window

flag = false

}

})()

}

})

最后找到原因的测试

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

相关文章:

  • 好用的视频转换切割软件
  • 中科罗伯特机器人吧_从汽车行业能预见工业机器人的未来吗
  • 找到一个新家,我要带着遗憾的泪水搬家了。
  • lamda 对比两个list_如何使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象(附代码)...
  • 论《Java替代C语言的可能性》
  • vue添加定位功能_Vue项目引用百度地图并实现搜索定位等功能
  • 通讯中的字节网络顺序和字节主机顺序
  • python tableau自动化导出_使用 Python 导出 Tableau 自定义形状 (Extracting Tableau Custom Shapes Using Python)...
  • tableau三轴该怎么做_在视图中为多个度量添加轴
  • 投资者的七个等级
  • python正则表达读取word_python 正则表达
  • python中土耳其编码范围_Python-编码这趟浑水
  • 做聪明的人很容易,但做善良的人很难
  • webis个人主页设计_个人网页(个人主页)设计论文
  • [个人] 确立了新的研究方向
  • 分享一款快速APP功能测试工具
  • EOS是什么
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vue官网教程学习过程中值得记录的一些事情
  • 搭建gitbook 和 访问权限认证
  • 汉诺塔算法
  • 回顾2016
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 那些被忽略的 JavaScript 数组方法细节
  • 巧用 TypeScript (一)
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 白色的风信子
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #etcd#安装时出错
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2015)JS ES6 必知的十个 特性
  • (AngularJS)Angular 控制器之间通信初探
  • (ros//EnvironmentVariables)ros环境变量
  • (动态规划)5. 最长回文子串 java解决
  • (九)c52学习之旅-定时器
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET Micro Framework初体验
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 读取 JSON格式的数据
  • .NET 反射的使用
  • .net 生成二级域名
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .netcore如何运行环境安装到Linux服务器
  • .net专家(张羿专栏)
  • .pyc文件是什么?
  • /etc/shadow字段详解
  • ::前边啥也没有
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [AIGC] Java 和 Kotlin 的区别
  • [Android 数据通信] android cmwap接入点