解析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访问XML数据的实例
Dec 27 Javascript
用JavaScript隐藏控件的方法
Sep 21 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
Jan 19 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
Javascript中的getUTCDay()方法使用详解
Jun 10 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
谈谈JavaScript异步函数发展历程
Sep 29 Javascript
Javascript 获取鼠标当前的位置实现方法
Oct 27 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 Javascript
Typescript类型系统FLOW静态检查基本规范
May 25 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之第二天
2006/10/09 PHP
一段php加密解密的代码
2007/07/16 PHP
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
php银联网页支付实现方法
2015/03/04 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
JS中style属性
2006/10/11 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
javascript 操作符(~、&、|、^、)使用案例
2014/12/31 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python用Jira库来操作Jira
2020/12/28 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
《开国大典》教学反思
2014/04/19 职场文书
实习单位推荐信
2015/03/27 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技