Vue封装JS-箭头函数传参的值类型与引用类型的差异

应用场景

写了一个关于canvas的标注项目,大量的canvas交互,html结构不超过50行,但是js逻辑大约2000行,主要就是对页面上的一个canvas进行操作。本着一个.vue不超过400行的宗旨,对js文件进行拆分,公共的放在common文件夹下进行统一使用,不能二次使用的也根据类别进行归类。

然后就出现了下面的场景

import { getImgScale } from '@/assets/js/ImageLoad.js'
import { getDom ,mapCursor,setSelect, Draw, refreshCanvas} from 'common/js/Assistant.js'
import { apiGetImage } from 'common/js/api.js'
import { mapState , mapMutations} from 'vuex'
import { Rect, Info} from 'common/js/normalize.js'
import { InitBoxPosition } from '@/assets/js/InitClientWh.js'
import { judgeIsInRect} from "common/js/Rect.js";

箭头函数

记得最开始使用箭头函数的时候,带给我最大的便利的不是书写方便,而是this的指向性,this指向他定义的的地方,在使用异步回调的时候,箭头函数非常方便,并不需要let that = this;这种普通构造函数内需要保存变量的写法。这也是最开始使用箭头函数的原因。写多了,慢慢的就是拿来即用,没有考虑上下文环境。

因为封装了大量的js,js文件内部又是大量的数据操作,直到前几天莫名出现了一个bug,开始的时候没有在意,调试了一下没有找到问题,然后换了另外一种实现方法,在今天莫名又遇到了这个问题,停下来看了看问题的原因,原来这是箭头函数this的问题啊。
看下列示例代码:

<template>
<div>
  <div class="hello">
    value:{{value}}
    val:{{val.val1}}
  </div>
  <button type='button' @click="change"></button>
</div>
</template>

<script>
import {func1,func2} from '@/CommonJs/common.js'
export default {
  name: 'HelloWorld',
  data () {
    return {
      value:0,
      val:{
        val1:0
      },
    }
  },
  methods:{
    change(){
      func1(this.value);
      func2(this.val);
    }
  }
}
</script>

vue文件调用了common.js文件的func1、func2方法:
conmon.js

export let func1=(val)=>{
  console.log(this)
  val=100
}
export let func2=(val)=>{
  console.log(this)
  val.val1=100
}

点击按钮,理论上两个对应的val值会变为100。看效果


image.png

只有val改变了,why?其实就是一个this指向的问题,但是会容易忽略:
看控制台:

image.png

打印this后,两个函数this相同,并没有指向那个vue文件,而是common.js文件,因为这才是它定义的地方。

结论?

箭头函数传参,如果在其他vue页面调用此脚本中的箭头函数 例如let a=(val)=>{..changevalue}

  • 传递参数一定会为this.value这种写法的 例如 a(this.name),会将this传递进箭头函数

  • 但是,箭头函数内部读取到this的时候,因为箭头函数的this指向定义的位置,

  • 所以当传递this的时候,箭头函数会将传递的this指向当前脚本定义的位置,这个js文件

  • 因此如果在箭头函数内部修改这个值,并不会映射到这个vue页面的值,例如上面的this.value, 因为,他修改的是当前js文件下的this.value值,因为this的指向变了。

  • 如果传递引用类型,a(this.obj),则将this.obj传递进箭头函数时,会将vue页面的this.obj对应的内存中的指针
    赋值给当前js脚本的this.obj(箭头函数传递后,this引用改变,相当于会在当前脚本创建了一个obj),

  • 但是尽管不是同一个obj,但是引用却指向同一块内存,所以传递引用类型进行修改会映射到原来的值。
    很简单的this指向与值类型引用类型的问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容