聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数?
聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数
本文重点知识点速览:
- Vue 中的 watch 对象中的回调函数不能是箭头函数。
- 箭头函数中的 this 指向的是函数定义时所在的对象,普通函数中的 this 指向的是函数运行时所在的对象。
- 函数的 this 指向问题。
一起学习吧...
说起箭头函数大家一定不陌生,箭头函数是 ES6 中对函数的扩展,使用起来方便快捷,可能有些小伙伴对箭头函数不是特别了解,所以在这里先举个例子吧。
// 普通函数定义
function add(a, b) {
return a + b;
}
// 箭头函数等价定义
const add = (a, b) => {
return a + b;
}
// 普通匿名函数
fucntion() {
console.log('hello');
}
// 箭头函数等价定义
() => {
console.log('hello');
}
箭头函数在定义回调函数中使用的非常多,但是在 Vue 中的 watch 对象的回调函数中就不能使用回调函数,先看下面的例子:
代码有一点长,简单说明一下就不用看所有的代码了,下面代码实现的是实现监视数据 a 和 b 的变化,当其中一个改变时执行相应的回调函数求a与b的和,重点在 23-30 行。
下面的代码中 watch 中回调函数是普通的函数,我们知道 对于普通函数,函数中的this指向函数运行时所在的对象。
所以,当我们在浏览器中改变a的值时(例如在浏览器的控制台输入 vm.a = 10),代码 23 行打印出来的是一个 Vue 对象(即代码 14行新创建出来的vm实例),因为此时 代码 22 行的 function 函数运行在 vm 对象中,此时页面会发生变化,由原来的 3 变为 12.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的watch</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{sum}}
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
a: 1,
b: 2,
sum: 3
},
watch: {
a: function() {
console.log(this);
this.sum = this.a + this.b;
},
b: function() {
this.sum = this.a + this.b;
}
}
})
</script>
</body>
</html>
我们再来看一下用箭头函数当做 watch 的回调函数的情况,把代码21-29行换成如下的代码即可:
watch: {
a: () => {
console.log(this);
this.sum = this.a + this.b;
},
b: () => {
this.sum = this.a + this.b;
}
}
当我们这时候再在浏览器的控制台改变 a 的值时(比如 在控制台输入 vm.a = 10),会发现打印出来的是 window 对象,所以页面的内容也不会发生变化。
JS 代码分为 预解析阶段和执行阶段,在预解析阶段遇到函数声明会提前进行预解析,此时下面代码中的箭头函数会在全局定义,因为 var vm = new Vue({...})
这句代码在预解析阶段还没有被执行。当到了执行阶段并且在控制台改变 a 的值后,watch 中的下面代码中的箭头函数开始执行,此时的运行环境确实是新创建的 vm 对象。但是对于箭头函数来说,箭头函数中的 this 指向的是定义时的对象而不是函数运行时所在的对象,这一点与普通函数有很大的区别。
a: () => {
console.log(this);
this.sum = this.a + this.b;
}
如果对于 this 的指向问题如果还不是很清楚可以参考下面的两篇博客:
完
欢迎指正
聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数?的更多相关文章
- JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...
- vue根据数组对象中某个唯一标识去重
由于在vue中,会自动在数组和对象中加入_obser__观察者模式的一些属性,所以直接用数组的filter去重(下面这种),indexOf不能准确识别 var arr = [1, 2, 2, 3, 4 ...
- 浅谈ListBox控件,将对象封装在listBox中,在ListBox中显示对象中某个属性,在ListBox中移除和移动信息
大家好,俗称万事开头难,不经历风雨,怎能见彩虹.在此小编给大家带来一个自己练习的小实例,希望与大家一起分享与交流.下面进入应用场景,从SQL2008数据库取出数据,给ListBox赋值在界面并显示出来 ...
- 【java基础】java中Object对象中的Hashcode方法的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- Vue2实践computed监听Vuex中state对象中的对象属性时发生的一些有趣经历
今天想实现一个功能,在全局中随时改变用户的部分信息.这时候就想到了用Vuex状态控制器来存储用户信息,在页面中使用computed来监听用户这个对象.看似一个很简单的逻辑,就体现了我基本功的不扎实呀. ...
- VUE错误记录 - 品牌后台练习 search(); 数组 splice forEach push 箭头函数
methods:{ add(){ var car = { id: this.id, name: this.name, ctime: new Date()}; this.list.push(car); ...
- IOS9中联系人对象的使用及增删改查操作的函数封装
之前克服重重困难把IOS9中新的类联系人搞明白了,现在把增删改查封装成了函数,如下: // // ViewController.m // IOS9中联系人CNContact的使用 // // Crea ...
- 对List集合中的对象中的某个属性进行排序
今天在项目中遇到的问题,不能在sql中进行order by.所以将数据库中查询出来的集合,在java代码中进行排序 Collections.sort(list, new Comparator<H ...
- java 8 list的stream操作 list中的对象中的某一个成员取出转为该成员的list,以及对象过滤,筛选某个属性后的成员
取成员属性list List<String> configList = codeEntityList.stream().map(t -> t.getName()).distinct( ...
随机推荐
- JavaWeb01-常识
软件系统体系结构 1 常见软件系统体系结构B/S.C/S 1.1 C/S l C/S结构即客户端/服务器(Client/Server),例如QQ: l 需要编写服务器端程序,以及客户 ...
- Python算法——《算法图解》笔记
算法目录 二分查找 大O表示法 选择排序 递归 快速排序,分而治之(D&C) 散列表——字典 广度优先搜索——BFS Dijkstra算法 贪婪算法 二分查找 # 要求list是有序表,num ...
- 找到了element, 但是用getText却得到空值,取不到文本的解决办法
最近代码中发现一些bug, 在Debug过程中发现,页面元素是被定位到了,但是用getText方法取到的却是空值.调查了一下发现,getText是否返回值和isDisplayed是否为true有关.当 ...
- Java的Arrays类 基本用法
初识Java的Arrays类 Arrays类包括很多用于操作数组的静态方法(例如排序和搜索),且静态方法可以通过类名Arrays直接调用.用之前需要导入Arrays类: import java.uti ...
- /proc/cpuinfo文件解读(超易理解)
在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...
- JRE JDK JVM的区别
jdk>jre>jvm jdk是面向开发者具有编译功能: jre是面向用户的,主要是class文件的运行,假如我们只有编译好的class文件和jre,那么就可以运行class了. jvm是 ...
- 仿微信 即时聊天工具 - SignalR (一)
话不多说,先上图 背景: 微信聊天,经常会遇见视频发不了,嗯,还有聊天不方便的问题,于是我就自己买了服务器,部署了一套可以直接在微信打开的网页进行聊天,这样只需要发送个url给朋友,就能聊天了! 由于 ...
- Java8 Stream中间操作使用详解
前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...
- CCNA 之 三 TCP/IP 及 子网划分
TCP/IP TCP/IP 协议集或协议簇 概念: 传输控制协议/IRI特网协议(TCP/IP)组是由美国国防比(DoD)所创建的,主要用来确保数据的完整性及毁灭性战争中维持通信 是有一组不同功能的协 ...
- php 精度计算问题
PHP var_dump(intval(0.58 * 100)); 正确结果是 57,而不是 58 浮点运算惹的祸 其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 N ...