解析vue data不可以使用箭头函数问题


Posted in Javascript onJuly 03, 2018

首先需要明确,a() {}和 b: () => {}是不同的

let obj = {
   a() {},
   // 相当于
   a:function() {},
   b: () => {}
}

1 VUE.js 源码解析

注意此处只设计核心代码

这段代码也是UMD实现原理,本文这里不是重点,有兴趣的可以自行探究。

(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
   typeof define === 'function' && define.amd ? define(factory) :
   (global.Vue = factory());
  }(this, (function (){
   'use strict';
    console.log(this) //*undefined*
  })))

解析一:

对于javascript来说,非严格模式下函数都会有一个this指向,不清楚的这里有传送门this指向相关

说一下本文中涉及的this指向问题,如果不是严格模式,this应该指向window,但是由于vue作者使用的是严格模式,所以他指向了undefined

以下是vue中data的实现原理

(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
   typeof define === 'function' && define.amd ? define(factory) :
   (global.Vue = factory());
  }(this, (function (){
   'use strict';
   function getData(data,vm) {
    return data.call(vm, vm)
   }
   function initData(params) {
    data = vm._data = typeof data === 'function'
    ? getData(data, vm)
    : data || {};
   }
   initData()  
  })))

也就是说每次新创建实例的时候都会去判断是否有data函数,如果有的话就会将其赋值给vm._data,心细的同学会发现对于Vmm实例来说是没有data,而是有vm._data

es5函数和es6箭头函数

var obj = {
   a: () => {
   'use strict';
    console.log(this,'a')
   },
   b() {
    console.log(this,'b')
   },
   c() {
    // window
    let e = () => {
     console.log(this,'e')
    }
    return e
   }
  }
  obj.a() // window
  obj.b() // obj
  obj.c()() // obj

对于普通函数(非严格模式下),this指向调用者,es6中的this指向声明时的上下文环境。

结合以上两点解析今天的问题

(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
   typeof define === 'function' && define.amd ? define(factory) :
   (global.Vue = factory());
  }(this, (function (){
   'use strict';
   let vm = {}
   var data = () => {
    console.log(this);//undefined
    return {
     a: 1
    }    
   }
   function getData(data,vm) {
    return data.call(vm, vm)
   }
   function initData(params) {
    data = vm._data = typeof data === 'function'
    ? getData(data, vm)
    : data || {};
   }
   initData()
   console.log(vm);
  })))

以上代码说明你使用箭头函数给data: () => {} this指向undefined的时候,是会赋值给vm._data,但是他会相当于一个全局的,只要你不刷新页面他就会缓存你的data。

如果我们使用data() {}this指向Vm实例,所以他会随着实例更新。

总结

以上所述是小编给大家介绍的vue data不可以使用箭头函数问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js form 验证函数 当前比较流行的错误提示
Jun 23 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
Nov 24 Javascript
深入理解js数组的sort排序
May 28 Javascript
js 截取或者替换字符串中的数字实现方法
Jun 13 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
详解React之父子组件传递和其它一些要点
Jun 25 Javascript
vue+koa2搭建mock数据环境的详细教程
May 18 Javascript
create-react-app开发常用配置教程
Jun 25 Javascript
详解Vue SPA项目优化小记
Jul 03 #Javascript
jQuery实现表单动态添加与删除数据操作示例
Jul 03 #jQuery
JS实现显示当前日期的实例代码
Jul 03 #Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
Jul 03 #jQuery
vue 设置路由的登录权限的方法
Jul 03 #Javascript
jQuery阻止事件冒泡实例分析
Jul 03 #jQuery
详解VUE中常用的几种import(模块、文件)引入方式
Jul 03 #Javascript
You might like
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
python数据封装json格式数据
2018/03/04 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
如何利用python读取micaps文件详解
2020/10/18 Python
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
教师演讲稿范文
2014/01/08 职场文书
物业工作计划书
2014/01/10 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
美术毕业生求职信
2014/02/25 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
校运会班级霸气口号
2015/12/24 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL