JS(ES6)中this的四種用法
阿新 • • 發佈:2019-01-04
轉載文章: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