解析vue data不可以使用箭头函数问题
首先需要明确,a(){}和b:()=>{}是不同的
letobj={
a(){},
//相当于
a:function(){},
b:()=>{}
}
1VUE.js源码解析
注意此处只设计核心代码
这段代码也是UMD实现原理,本文这里不是重点,有兴趣的可以自行探究。
(function(global,factory){
typeofexports==='object'&&typeofmodule!=='undefined'?module.exports=factory():
typeofdefine==='function'&&define.amd?define(factory):
(global.Vue=factory());
}(this,(function(){
'usestrict';
console.log(this)//*undefined*
})))
解析一:
对于javascript来说,非严格模式下函数都会有一个this指向,不清楚的这里有传送门this指向相关
说一下本文中涉及的this指向问题,如果不是严格模式,this应该指向window,但是由于vue作者使用的是严格模式,所以他指向了undefined
以下是vue中data的实现原理
(function(global,factory){
typeofexports==='object'&&typeofmodule!=='undefined'?module.exports=factory():
typeofdefine==='function'&&define.amd?define(factory):
(global.Vue=factory());
}(this,(function(){
'usestrict';
functiongetData(data,vm){
returndata.call(vm,vm)
}
functioninitData(params){
data=vm._data=typeofdata==='function'
?getData(data,vm)
:data||{};
}
initData()
})))
也就是说每次新创建实例的时候都会去判断是否有data函数,如果有的话就会将其赋值给vm._data,心细的同学会发现对于Vmm实例来说是没有data,而是有vm._data
es5函数和es6箭头函数
varobj={
a:()=>{
'usestrict';
console.log(this,'a')
},
b(){
console.log(this,'b')
},
c(){
//window
lete=()=>{
console.log(this,'e')
}
returne
}
}
obj.a()//window
obj.b()//obj
obj.c()()//obj
对于普通函数(非严格模式下),this指向调用者,es6中的this指向声明时的上下文环境。
结合以上两点解析今天的问题
(function(global,factory){
typeofexports==='object'&&typeofmodule!=='undefined'?module.exports=factory():
typeofdefine==='function'&&define.amd?define(factory):
(global.Vue=factory());
}(this,(function(){
'usestrict';
letvm={}
vardata=()=>{
console.log(this);//undefined
return{
a:1
}
}
functiongetData(data,vm){
returndata.call(vm,vm)
}
functioninitData(params){
data=vm._data=typeofdata==='function'
?getData(data,vm)
:data||{};
}
initData()
console.log(vm);
})))
以上代码说明你使用箭头函数给data:()=>{}this指向undefined的时候,是会赋值给vm._data,但是他会相当于一个全局的,只要你不刷新页面他就会缓存你的data。
如果我们使用data(){}this指向Vm实例,所以他会随着实例更新。
总结
以上所述是小编给大家介绍的vuedata不可以使用箭头函数问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。