1. 程式人生 > >JS(ES6)中this的四種用法

JS(ES6)中this的四種用法

轉載文章:https://www.cnblogs.com/pabitel/p/5922511.html

JS(ES6)中this的五種用法

1.在回撥函式中使用this 不知道呼叫者是誰?

//setInterval定時器函式中的回撥函式,不知道最後是那個在呼叫,如果回撥函式不用箭頭函,那this就不知道是誰?
let startObj = {
    init:function(){
        setInterval(() => {
            console.log(this); //因為是箭頭函式,所以這裡的this和init()函式的this一致,指向startObj物件;
        },1000)
    },

    initx: function() {
        console.log(this);//這裡的this直接指向startObj物件;
    }
}
startObj.init();
startObj.initx();

首先講js中最特殊也是最容易犯錯的一種,回撥函式中的this,回撥函式屬於非同步函式,你不知道最後是誰在呼叫它,所以this很容易犯錯!那麼在回撥函式中,我們可以使用箭頭函式()=> {}  ,因為箭頭函式不繫結this,永遠和上一個封閉函式中的this保持一致!

 

1.在一般函式方法中使用 this 指代全域性物件

function test(){    
    this.x = 1;    
    alert(this.x);  
}  test(); // 1

2.作為物件方法呼叫,this 指代上級物件

 

function test(){
  alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1

 

3.作為建構函式呼叫,this 指代new 出的物件

 

  function test(){
    this.x = 1;
  }
  var o = new test();
  alert(o.x); // 1
    //執行結果為1。為了表明這時this不是全域性物件,我對程式碼做一些改變:
  var x = 2;
  function test(){
    this.x = 1;
  }
  var o = new test();
  alert(x); //2

 

 

4.apply 呼叫 ,apply方法作用是改變函式的呼叫物件,此方法的第一個引數為改變後呼叫這個函式的物件,this指代第一個引數

 

  var x = 0;
  function test(){
    alert(this.x);
  }
  var o={};
  o.x = 1;
  o.m = test;
  o.m.apply(); //0
//apply()的引數為空時,預設呼叫全域性物件。因此,這時的執行結果為0,證明this指的是全域性物件。如果把最後一行程式碼修改為

  o.m.apply(o); //1