javascript--this機制

  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

  

若是文中有出現錯誤的地方,歡迎你們指正

相關文章
相關標籤/搜索