解析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使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
jQuery验证插件validate使用详解
May 11 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
Sep 04 Javascript
使用veloticy-ui生成文字动画效果
Feb 08 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
May 10 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 Javascript
layui 中select下拉change事件失效的解决方法
Sep 20 Javascript
Element Popover 弹出框的使用示例
Jul 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
python连接数据库的方法
2017/10/19 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
某科技软件测试面试题
2013/05/19 面试题
学生干部的自我评价分享
2014/01/18 职场文书
主题党日活动总结
2014/07/08 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书