this在javascript中很常見同時也是種比較複雜的機制,正確地瞭解this而且學會正確使用,可讓咱們寫出更高效、優雅的代碼。javascript
this是在代碼運行時進行綁定的,並不在編寫時,它的上下文環境取決於韓式調用時的各類條件。this的綁定和函數聲明的位置沒有任何的關係,只取決於函數的調用方式。java
this的四種綁定規則app
一、默認綁定函數
function foo(){ console.log(this.a); } var a = 2; foo(); //2
調用foo()時,內部的this會指向全局對象,應用了this的默認綁定this
可是,若是實在嚴格模式下的話,this就是指向了undefined了spa
二、隱式綁定對象
function foo(){ console.log(this.a); } var obj = { a : '3', foo : foo } obj.foo(); //3
聲明對象obj,屬性foo是引用了函數foo,當obj.foo()調用時,隱式綁定規則會把函數調用的this綁定到這個obj上下文對象blog
三、顯式綁定ip
function foo(){ console.log(this.a); } var obj2 = { a : 4 } foo.call(obj2); //4
經過foo.call()能夠在調用foo時強制把它的this綁定到obj上io
四、new綁定
function baz(a){ this.a = a } var bar = new baz(5); console.log(bar.a);
使用new關鍵字調用函數會發生什麼操做在上篇博文也有介紹到,構造出一個新對象並把它綁定到baz調用中的this上
判斷this規則
咱們能夠按照如下的規則來判斷this是應用了哪一個規則:
一、函數是否在new中調用?是的話this綁定的是新建立對象
var bar = new foo();
二、函數是否經過call、apply顯式綁定?是的話this綁定了指定對象
foo.call(obj);
三、函數是否在某個上下文調用隱式綁定,是的話this綁定那個上下文對象
obj.foo()
四、若是都不是的話,this則應用了默認綁定
綁定例外
當咱們把null和undefined做爲this的綁定對象傳入call、apply時,這些值會被忽略,其實是應用了默認綁定
function foo(){ console.log(this.a); } var a = 2; foo.call(null); //2
若是文中有出現錯誤的地方,歡迎你們指正