动态绑定
JavaScript的this并不“指向自身”。
this是在运行时候进行绑定的,,并不是编写的时候绑定的。
this指向执行上下文,何为执行上下文,我的理解是函数在“哪里”执行的,这个记录会包含函数在哪里会被调用(调用栈),函数的调用方式,传入参数等信息。this就是这个记录的一个属性。最常见的执行上下文就是window,如
var a=2;
function foo(){
alert(this.a); //2
}
foo();
很明显,foo函数在window这个“环境”下执行,所以this指向了window。(但在严格模式下,this不默认指向window,所以代码弹出undefined)
function foo(){
alert(this.a);
}
var obj={
a:2,
foo:foo
}
obj.foo(); //2
函数foo在obj的环境下执行,this默认绑定到obj上。
以上两种都属于默认绑定。
JavaScript中可以控制this的绑定
js中有call()和apply()可以显性的传入要绑定的对象
var obj={
a:10
}
function foo(){
alert(this.a);
}
foo.call(obj); // 10
new绑定
function foo(a){
this.a=a
}
var bar=new foo(20);
console.log(bar.a); // 20
使用new来调用foo()时。我们会构造一个新对象并把它绑定到foo()调用中的this上。
this四条绑定规则的优先级
优先级最高的是new绑定,new中调用函数,this绑定到新创建的对象中。
其次的是call,apply中显性传入要绑定的对象。
函数是否在某个上下对象中调用,如果是,this绑定的是上下文对象
如果都不是,函数在全局对象执行,则绑定到全局对象中,在严格模式下,就绑定到undefined。