解析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操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
May 23 Javascript
js触发onchange事件的方法说明
Mar 08 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
Jul 12 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
Mar 28 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
Jul 13 Javascript
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
vue+iview分页组件的封装
Nov 17 Vue.js
详解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/05/15 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
python类的实例化问题解决
2019/08/31 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
大学自荐信
2013/12/12 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2015年加油站工作总结
2015/05/13 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers