js中this绑定规则
1. 默认绑定
function foo() {
console.log(this.a);
}
var a = 2;
foo();
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1f8f28e2984e3c1625940d9cd7d54a23.png#pic_center)
函数采用不带任何修饰的函数引用进行调用时,this采用默认绑定,指向全局变量。
2. 隐式绑定
function foo() {
console.log(this.a);
}
var obj = {a: 2, foo: foo};
obj.foo();
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ff848e1176fa5d7604e620e18202863c.png#pic_center)
函数被当作引用属性添加到obj中时,this会指向obj对象。
3. 显式绑定
function foo() {
console.log(this.a);
}
var obj = {a: 2};
foo.call(obj);
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/37c4a81575e5262d52d42946f12c6777.png#pic_center)
通过foo.call(),可以在调用foo时强制把它的this绑定到obj上。
如果在call,apply或者bind中传入null或者undefined时,this会采用默认绑定规则。
4. new绑定
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log(bar.a);
运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/561eb8f892cf76f917aee2d72f7b38b7.png#pic_center)
new来调用 foo() 时,会构造一个新对象并把它绑定到 foo() 调用中的 this 上。
判断this指向时,可以按以下顺序判断
- 函数是否在 new 中调用,如果是的话 this 绑定的是新创建的对象。
- 函数是否通过 call、apply(显式绑定)调用,如果是的话,this 绑定的是指定的对象。
- 函数是否在某个上下文对象中调用(隐式绑定),如果是的话,this 绑定的是那个上 下文对象。
- 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。
另外,箭头函数不使用 this 的四种标准规则,而是根据外层作用域来决定this指向。