关于this

this的调用一般分为以下几种


  1. 默认绑定
  2. 隐式绑定
  3. 显式绑定
  4. new绑定
  5. 箭头函数上下文绑定

其实看this到底是谁,取决与被谁调用,之前有个博文说得 好

this的指向取决于前面那个点

1,默认绑定

foo();
这里的foo里如果使用了this,这个this在非严格模式是指向了全局的window对象
因为他没被其他任何人调用,也就是...前面没点

2,隐式绑定

obj={
    foo(){}
}
obj.foo();
这时候foo的this会指向obj,也就是绑定到了上下文对象上,也就是调用他的对象上。
当然这时候看点, .foo 前面是 obj 所以this = obj
如果是这样
bar=obj.foo;
bar();
这时候bar的this又变成了window,就是变回了默认绑定,因为没有调用方

3,显式绑定

obj={}
foo(){}
foo.call(obj)
foo.apply(obj)
foo.bind(obj)
这种相当于强制绑定,直接把this强制绑到了obj

4,new绑定

new foo();
这里要牵扯到new的实现了,内部使用了'类似'显式绑定的方法
新建一个对象,通过调用目标函数的call来显示绑定到新建的对象上,形成this

5,箭头函数

箭头函数的this取决于声明时候的当前上下文,也就是说本身不具备this
这里有个坑就是如果你声明一个函数,声明的时候用了箭头函数声明,还在里面使用了this,
这时候this指的其实是 默认绑定的结果

    window.a=1;
    let obj={
      a:2,
      say:()=>{
        console.log(this.a);
      },
      hey:function(){
        console.log(this.a);
      }
    }
    obj.say(); //1
    obj.hey(); //2

总结一下:

  1. 由 new 调用?绑定到新创建的对象。
  2. 由 call 或者 apply(或者 bind)调用?绑定到指定的对象。
  3. 由上下文对象调用?绑定到那个上下文对象。
  4. 默认:在严格模式下绑定到 undefined,否则绑定到全局对象
  5. 箭头函数指向作用域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值