熟練掌握js中this的用法,解析this在不一樣應用場景的做用

因爲其運行期綁定的特性,JavaScript 中的 this 含義要豐富得多,它能夠是全局對象、當前對象或者任意對象,這徹底取決於函數的調用方式。
JavaScript 中函數的調用有如下幾種方式:做爲函數調用,做爲對象方法調用,做爲構造函數調用,和使用 apply 或 call 調用。下面咱們將按照調用方式的不一樣,分別討論 this 的含義。
狀況一:純粹的函數調用
這是函數的最一般用法,屬於全局性調用,所以this就表明全局對象Global。
一、函數也能夠直接被調用,此時 this 綁定到全局對象。
function makeNoSense(x) { 
    this.x = x; 
} 
makeNoSense(5); 
console.log(x);// x 已經成爲一個值爲 5 的全局變量
function test(){
  this.x = 1;
  alert(this.x);
}
test(); // 1

狀況二:做爲對象方法的調用java

函數還能夠做爲某個對象的方法調用,這時this指代對象內部屬性被調用。編程

var myObject = {
  value :0,
  increment:function (inc){
    this.value += typeof inc ==='number' ? inc:1;
  }
};
myObject.increment();
console.log(myObject.value);  //1
myObject.increment(2);
console.log(myObject.value);  //3

狀況三 :做爲構造函數調用數組

javaScript 支持面向對象式編程,與主流的面向對象式編程語言不一樣,JavaScript 並無類(class)的概念,而是使用基於原型(prototype)的繼承方式。
相應的,JavaScript 中的構造函數也很特殊,若是不使用 new 調用,則和普通函數同樣。做爲又一項約定俗成的準則,構造函數以大寫字母開頭,提醒調用者使用正確的方式調用。若是調用正確,this 綁定到新建立的對象上。
所謂構造函數,就是經過這個函數生成一個新對象(object)。這時,this就指這個新對象。
function Point(x, y){ 
    this.x = x; 
    this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

爲了代表這時this不是全局對象,我對代碼作一些改變:app

var x = 4;
function Point(x, y){ 
    this.x = x; 
    this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

狀況四: apply或call調用編程語言

讓咱們再一次重申,在 JavaScript 中函數也是對象,對象則有方法,apply 和 call 就是函數對象的方法。這兩個方法異常強大,他們容許切換函數執行的上下文環境(context),即 this 綁定的對象。不少 JavaScript 中的技巧以及類庫都用到了該方法。讓咱們看一個具體的例子:
function Point(x, y){ 
    this.x = x; 
    this.y = y; 
    this.moveTo = function(x, y){ 
        this.x = x; 
        this.y = y; 
        console.log(this.x+","+this.y);
    } 
} 
var p1 = new Point(0, 0); 
var p2 = {x: 0, y: 0}; 
p1.moveTo(1, 1); //1,1
p1.moveTo.apply(p2, [10, 10]);//10,10

在上面的例子中,咱們使用構造函數生成了一個對象 p1,該對象同時具備 moveTo 方法;使用對象字面量建立了另外一個對象 p2,咱們看到使用 apply 能夠將 p1 的方法應用到 p2 上,這時候 this 也被綁定到對象 p2 上。另外一個方法 call 也具有一樣功能,不一樣的是最後的參數不是做爲一個數組統一傳入,而是分開傳入的。本文經過對JavaScript中常常容易混淆的this在四中應用場景中的使用方法進行了講解,但願對您有所幫助,喜歡的話,請推薦一下哦。函數

相關文章
相關標籤/搜索