一、this、new、bind、call、apply
1. this的指向
this 是在函数被调用时确定的,它的指向完全取决于函数调用的地方,而不是它被声明的地方(除箭头函数 外)。
当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传 入的参数等信息。 this 就是这个记录的一个属性,它会在函数执行的过程中被用到。
this在函数的指向的五种场景
- 作为构造函数被new调用;
- 作为对象的方法使用;
- 作为函数直接调用;
- 被call、apply、bind调用;
- 箭头函数中的this;
2. this绑定的优先级
为什么要考虑this绑定的优先级?
因为this存在多个使用场景,当多个场景同时出现的时候, this 到底应该如何指向。
如何判断this绑定的优先级?
this绑定优先级:new 绑定 > 显示绑定 > 隐式绑定 > 默认绑定
1. new 绑定: 函数是否在 new 中调用?如果是的话 this 绑定的是新创建的对象;
2. 显式绑定: 函数是否是通过 bind 、 call 、 apply 调用?如果是的话, this 绑定的是指定的对象;
3. 隐式绑定: 函数是否在某个上下文对象中调用?如果是的话, this 绑定的是那个上下文对象;
4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined ,否则绑定到全局对象。
3. 箭头函数中的this
ES6 语法中,箭头函数是根据其声明的地方来决定this的,不同于其他4种this指向。
特点:
- call、apply、bind无法修改箭头函数中的this绑定
- 箭头函数没有构造函数 constructor,所以也不可以使用 new 调用,即不能作为构造函数