VUE2中let that = this 与 箭头函数的关系

351 阅读2分钟

在vue2的项目中时不时会出现这样的代码,我很疑问为什么要这样写,直接写this不舒服吗,为何还要多此一举。后来上网搜了搜发现他的作用是这样的。

虽然在vue2的methods的每个方法中this默认指向该组件,但并不是绝对的,比如方法中使用到下列函数时

Array.forEach(function(){},**)数组循环的函数,第二个参数指定在函数fn中this的指向,当没有给参数二赋值时,fn中的this默认为undefined。(之前踩过坑)

补充: 方法一:使用箭头函数Array.forEach(()=>{}),此时this指向外界的this,即Vue组件。 方法二:给forEach函数赋值参数二,Array.forEach(function(){},this),此时回调函数中的this指向参数二。 方法三: 使用代码let that = this,在回调函数中使用that变量

setTimeout(function(),**)setInterval(fn(),**)定时器函数参数一fn函数中的this默认指向window。

补充:方法一: 使用箭头函数setTimeout(()=>{},**),此时this指向外界的this,即Vue组件。 方法二: 使用代码let that = this,在回调函数中使用that变量

当vue方法中使用到这些函数时,在函数内部如果还想使用该组件的数据和方法,可以在vue方法中let that = this,这样在这些函数内部就可以使用that.*** 的方式正常使用该组件内部的数据了。

可能还有其他的情况使得在函数内部this不指向当前组件,目前就想起来这两个。

想法来源

分割线

又来补充来了

之前一直以为箭头函数=>的this指向特点是一个待完善的问题,今天我发现我错了,箭头函数的this指向特性就是为了完善js函数中this的问题而存在的。

箭头函数除了书写简便的优点,还有适合使用的场景,和不适合使用的场景。

适合场景:

ES6 之前,JavaScript 的 this 对象一直很令人头大,回调函数,经常看到 var self = this 这样的代码,为了将外部 this 传递到回调函数中,那么有了箭头函数,就不需要这样做了,直接使用 this 就行。(见上文的补充)

不适合场景:

image.png

这里我想说的是,箭头函数中的this指向外界的this,不是我原先想的是一个bug,而是有它适合的场景的,比如解决一直写let that = this的尴尬。