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。