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