解析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 23 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
轻松实现js选项卡切换效果
Sep 24 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
JavaScript实现简单图片轮播效果
Aug 21 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
vue动态设置img的src路径实例
Sep 18 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 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读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
php限制文件下载速度的代码
2015/10/20 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
javascript打印输出json实例
2013/11/11 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
使用python画个小猪佩奇的示例代码
2018/06/06 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
python全栈知识点总结
2019/07/01 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
工商管理实习自我鉴定
2013/09/28 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
机械专业求职信范文
2014/07/15 职场文书
给客户的感谢信
2015/01/21 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
创建文明城市倡议书
2015/04/28 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python
MySQL空间数据存储及函数
2021/09/25 MySQL