You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 初始化的时候,执行的initMethods中绑定了this(vm)functioninitMethods(vm: Component){constmethods=vm.$options.methodsif(methods){for(constkeyinmethods){vm[key]=methods[key]==null ? noop : bind(methods[key],vm)if(process.env.NODE_ENV!=='production'&&methods[key]==null){warn(`method "${key}" has an undefined value in the component definition. `+`Did you reference the function correctly?`,vm)}}}}//bindfunctionbind(fn,ctx){functionboundFn(a){varl=arguments.length;returnl
? l>1
? fn.apply(ctx,arguments)//通过返回函数修饰了事件的回调函数。绑定了事件回调函数的this。并且让参数自定义。更加的灵活
: fn.call(ctx,a)
: fn.call(ctx)}// record original fn lengthboundFn._length=fn.length;returnboundFn}
箭头函数的This指向
前言
楼主在昨天在看Vue文档的时候,主要到
methods
和computed
里面不要使用箭头函数,去看了下源码解析,发现里面调用的是通过自定义的bind
函数,通过call()
来执行函数以及绑定作用域,想巩固一下箭头函数,于是这边有内涵的blog就上线了。之前楼主有一篇箭头函数的This, 对于它的理解感觉有偏差,这里全部再重复总结一遍。
看完本篇文章,你可以彻底了解this和bind
涉及知识点
实现一个bind函数
调用方式:
直接调用 (内部this一般是window)
构造函数的调用,通过bind绑定的this无效 (this是实例对象)
当使用构造函数的时候,我们需要构建原型链,所以需要加工一下。
实例 : 当我们调用bind()的时候,即执行了
var fn1 = fn.bind({name: 1},1,3)
, 会返回一个新的函数,下面是作用域链解析。再调用fn1(3,4),相当于执行函数
思考,下面函数执行时多少,this是什么
答案
{name:1} 3
所以当我们执行
fn.bind({name:1},1,2).call({name:2},3,4)
,本质上call
并不能改变bind的返回函数的this,只是改变了内部封装了一个函数(xxx)的this,这也是bind的this参数不能被重写的原因。总结bind函数到底做了什么
箭头函数的this(定义时候的this)
一句话总结: 箭头函数的函数体内的
this
就是定义时候的this
,和使用所在的this没有关系。即:在定义箭头函数的时候就已经绑定了this,可以理解为就是在定义的时候,通过bind函数进行强行绑定this。
案例一
案例二
案例三
总结:我们知道Vue内部调用methods的时候,通过的
call
方法来执行methods中的相应的key函数,当我们使用箭头函数的时候,定义的时候就绑定了this,它源码中写的call()
并不会被使用,所以必须不能使用箭头函数Vue文档中methods的使用
参考文章
Vue methods 用箭头函数取不到 this
vue源码解析-事件机制
什么时候“不要”用箭头函数
ES6 箭头函数使用禁忌
推理例子
自己写的推理例子
The text was updated successfully, but these errors were encountered: