谈到this绑定规则要先找到函数执行过程中的调用位置。
调用位置就是函数在代码中被调用的位置。这就涉及分析调用栈(就是为了到达当前执行位置所调用的所有函数)。调用位置就在当前正在执行的函数的前一个调用中。
那什么是调用栈和调用位置呢?
//1.调用栈和调用位置
function baz(){
//当前调用栈是baz
//当前调用位置是全局作用域
console.log("baz");
bar(); //<--bar的调用位置
}
function bar(){
//当前调用栈是baz->bar
//当前调用位置是baz
console.log("bar");
foo();//<--foo的调用位置
}
function foo(){
//当前调用栈是baz->bar->foo
//当前调用位置是bar
console.log("foo");
}
baz();//<-- baz的调用位置
调用栈是baz->bar->foo,当调用foo()时调用位置就是bar(),可以简单理解为在bar()中调用foo().
注意是如何(从调用栈中)分析出真正的调用位置的,因为它决定了this的绑定。
this有四大绑定规则,下面来仔细看看这四大规则。
- 默认规则
function foo(){
console.log(this.a); //this.a被解析成全局变量a a=2
}
var a=2;
foo(); //2
foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定,无法应用其他规则
//严格模式下全局对象将无法使用默认绑定,this会绑定到undefined. 严格模式下与foo()的调用位置无关
function foo(){