解析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 相关文章推荐
JavaScript方法和技巧大全
Dec 27 Javascript
Javascript 判断 object 的特定类转载
Feb 01 Javascript
javascript中的作用域scope介绍
Dec 28 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
Nov 08 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
OpenLayers3实现对地图的基本操作
Sep 28 Javascript
Vue——前端生成二维码的示例
Dec 19 Vue.js
js基础语法与maven项目配置教程案例
Jul 15 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
中英文字符串翻转函数
2008/12/09 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
cakephp常见知识点汇总
2017/02/24 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
Python+django实现文件上传
2016/01/17 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python 发送json数据操作实例分析
2019/10/15 Python
Django 自动生成api接口文档教程
2019/11/19 Python
如何在python中判断变量的类型
2020/07/29 Python
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
库房主管岗位职责
2013/12/31 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
客服专员岗位职责
2014/02/28 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
React forwardRef的使用方法及注意点
2021/06/13 Javascript
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
Python中的tkinter库简单案例详解
2022/01/22 Python
SQL语句多表联合查询的方法示例
2022/04/18 MySQL