解析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 相关文章推荐
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
使用命令对象代替switch语句的写法示例
Feb 28 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
Dec 27 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
vue实现全选、反选功能
Nov 17 Javascript
Node接收电子邮件的实例代码
Jul 21 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
微信小程序如何再次获取用户授权的方法
May 10 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 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
PHP 防恶意刷新实现代码
2010/05/16 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
vue v-model的用法解析
2020/10/19 Javascript
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python实现截屏的函数
2015/07/26 Python
python非递归全排列实现方法
2017/04/10 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
django url到views参数传递的实例
2019/07/19 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
英语系本科生个人求职信
2013/09/21 职场文书
企业行政文员岗位职责
2013/12/03 职场文书
活动总结报告格式
2014/05/09 职场文书
爱国口号
2014/06/19 职场文书
电气自动化求职信
2014/06/24 职场文书
Python语言内置数据类型
2022/02/24 Python
golang的文件创建及读写操作
2022/04/14 Golang
OpenFeign实现远程调用
2022/08/14 Java/Android