javascript中this的指向問題

在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!

相關文章
相關標籤/搜索