1,this是什么?
表示当前对象的一个引用。当函数被调用时,会创建一个活动记录(执行上下文)。记录会包含 函数在哪被调用,调用方法,参数,this就是记录里的一个属性
2,this指向哪里?
this是函数被调用时发生的绑定,指向哪里完全取决于在哪里被调用。
3, 绑定规则优先级(判断顺序)
new绑定>显式绑定>隐式绑定>默认绑定
1 new绑定
function foo(a){
this.a=a
}
var bar=new foo(2)
console.log(bar.a) //2
// 会构造一个新对象并把它绑定到foo(...)调用中的this上
2,显式绑定
function foo(){
console.log(this.a)
}
var obj={
a:2
}
foo.call(obj) //2 .call()方法强制把this绑定到obj上
3,隐式绑定
function foo(){
console.log(this.a)
}
var obj={
a:2,
foo:foo
}
//当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象
//考虑调用位置是否有上下文对象 或是否被某个对象拥有或者包含
obj.foo() //foo函数被调用时 obj对象拥有他
// 对象属性引用链中只有最顶层(最后一层)会影响调用位置
function foo() {
console.log( this.a );
}
var obj2 = { a: 42, foo: foo };
var obj1 = { a: 2, obj2: obj2 };
obj1.obj2.foo(); // 42 最靠近foo()的是obj2对象
4,默认绑定
function foo(){
console.log(this.a) //此时this.a解析为全局变量a 函数调用时应用了this的默认绑定
}
var a=2;
foo(); // 非严格模式下输出2
4,绑定规则总结
1,函数是否在new中调用,this绑定的是新创建的对象 var bar=new foo()
2,函数是否通过call显示绑定,this绑定的是指定的对象,var bar=foo.call(obj2)
3,函数是否在某个上下文对象中调用,this绑定的是那个上下文对象,var bar=obj.foo()
3,默认绑定,绑定到全局对象