前言
- this既不指向自身,也不指向函数的词法作用域。
- this的绑定不是在编写代码的时候绑定的,而是在它运行的时候进行的。
- this的绑定和函数的声明位置没有任何关系,只取决于函数的调用方式。
this的绑定规则
this有四种绑定规则:
- 默认绑定
- 隐式绑定
- 显示绑定
- new绑定
让我们先来解释一下这四个规则。
默认绑定
函数的独立调用是函数最常见的一种调用方式,即直接使用不带任何修饰的函数引用进行的调用,此时函数中的this会默认绑定到全局对象。(在非严格模式下,严格模式会绑定到undefined)。这就是默认绑定。
请看以下代码:
function foo () {
console.log(this.a);
}
var a = 2;
foo();//2
此时的foo()直接使用的是不加任何修饰的函数引用的调用,因此函数中的this默认绑定到全局对象。
如果是严格模式,就会报错。
function foo() {
"use strict"
console.log(this.a);
}
var a = 2;
foo(); // TypeError:this is undefined
隐式绑定
当函数的调用存在某个上下文对象时,函数中的this就会绑定在这个上下文对象上。即函数被某个对