在javascript中每個function都是一個對象,this是javascript語言中的一個關鍵字,他表明函數運行時,自動生成的一個內部對象,只能在函數內部使用。javascript
thisjava
在函數執行中,this老是指向調用該函數的對象,要判斷this的指向,其實就是判斷this所在的函數屬於誰。數組
在javascript語言精粹這本書中,歸爲四類出現場景,簡單說:閉包
有對象就指向調用對象app
沒調用對象就指向全局對象函數
用new構造就指向新對象this
銅鼓apply或call或者bind來改變this的指向spa
一.函數有所屬對象時,指向所屬對象指針
函數有所屬對象時,一般經過函數表達式調用,這時,this天然指向所屬對象,好比code
1 var myObj={value: 100}; 2 myObj.getVale=function () { 3 console.log(this.value); //輸出100 4 console.log(this); 5 return this.value; 6 } 7 console.log(myObj.getValue()); //100
getValue()屬於對象myObj,並由myObj進行調用,因此this指向對象myObj。
二.函數沒有所屬對象,指向全局對象
1 var myObject = {value: 100}; 2 myObject.getValue = function () { 3 var foo = function () { 4 console.log(this.value) // => undefined 5 console.log(this);// 輸出全局對象 global 6 }; 7 8 foo(); 9 10 return this.value; 11 }; 12 13 console.log(myObject.getValue()); // => 100
foo函數雖然定義在getValue的函數體內中,可是實際上它既不屬於myObj。foo並無被綁在任何對象上,因此當調用時,他的this指針指向了全局對象global。
三.構造器中的this,指向新對象
js中,咱們經過關鍵詞來調用構造函數,此時this會綁定在該新對象上。
1 var SomeClass = function(){ 2 this.value = 100; 3 } 4 5 var myCreate = new SomeClass(); 6 7 console.log(myCreate.value); // 輸出100
順便說一句,在js中,構造函數,普通函數,對象方法,閉包這四者沒有明確界限,本身區分明白就好。
四.aply和call調用,以及bind綁定,指向綁定的對象
apply()方法接受兩個參數,第一個時函數運行的做用域,第二個時參數數組arguments。
call()方法第一個參數,與apply()第一個相同,只是,其餘參數須要一個個列舉出來。
簡單說,call方法更接近咱們平時調用函數,而apply須要咱們傳遞Array形式的數組給他。他們兩個是能夠相互轉換的。
1 var myObi={value: 100}; 2 var foo=function() { 3 console.log(this); 4 }; 5 foo(); //全局變狼global 6 foo.apply(myObj); //100 7 foo.call(call); //100 8 9 var newFoo=foo.bind(myObj); 10 newFoo(); //{value: 100}
That's all Thank you!