解析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 实现GridView异步排序、分页的代码
Feb 06 Javascript
利用JS实现浏览器的title闪烁
Jul 08 Javascript
js获取时间并实现字符串和时间戳之间的转换
Jan 05 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
如何动态加载外部Javascript文件
Dec 02 Javascript
从源码里了解vue中的nextTick的使用
Nov 22 Javascript
vue style width a href动态拼接问题的解决
Aug 07 Javascript
vue+高德地图实现地图搜索及点击定位操作
Sep 09 Javascript
Openlayers绘制聚合标注
Sep 28 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
Feb 05 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 全局变量范围分析
2009/08/07 PHP
php下获取客户端ip地址的函数
2010/03/15 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
Python中的连接符(+、+=)示例详解
2017/01/13 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
python批量处理文件或文件夹
2020/07/28 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
公司联欢晚会主持词
2014/03/22 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
现场施工员岗位职责
2015/04/11 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书
教师节主题班会方案
2015/08/17 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android