解析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实现运行代码需要刷新的解决方法
Aug 18 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
Nov 24 Javascript
js截取函数(indexOf,join等)
Sep 01 Javascript
js中settimeout方法加参数
Feb 28 Javascript
prototype框架中美元符号$用法分析
Jan 22 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
vuex实现简易计数器
Oct 27 Javascript
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
May 13 Javascript
vue之将echart封装为组件
Jun 02 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
May 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
JSONP之我见
2015/03/24 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
Python通过poll实现异步IO的方法
2015/06/04 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
python高级特性简介
2020/08/13 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
霸气押韵的班级口号
2014/06/09 职场文书
应届生面试求职信
2014/07/02 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2014年店长工作总结
2014/11/17 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
Python实现批量自动整理文件
2022/03/16 Python