解析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实现上传图片前的预览(TX的面试题)
Aug 14 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
Jul 16 Javascript
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
Jul 30 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
JavaScript字符串对象
Jan 14 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
Jan 03 Javascript
Element Carousel 走马灯的具体实现
Jul 26 Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 Javascript
vue实现单一筛选、删除筛选条件
Oct 26 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
PDO::errorCode讲解
2019/01/28 PHP
JS类的封装及实现代码
2009/12/02 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
Python中字典的setdefault()方法教程
2017/02/07 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers