thảo luận keyword "This" trong JS

ndv92

Senior Member
cái mình k hiểu là sao trong ES6 dùng class xong cái gì cũng phải this, this, éo hiểu sao nó k hiểu luôn là đang thực thi trong class đấy:angry:

Syntax của Class vẫn chưa ổn định, tương lai có thể thay đổi, tốt nhất vẫn nên dùng function.

Sent from HUAWEI CLT-L29 using vozFApp
 

marsuhuy

Senior Member
class là syntactic sugar th, chứ bản thân JS đâu phải OOP mà xài class.
Có xài class hay ko thì bản chất nó vẫn là một function nên this sẽ được quyết định lúc runtime chứ ko phải là class nào thì this sẽ thuộc class đó luôn.

Syntax của Class vẫn chưa ổn định, tương lai có thể thay đổi, tốt nhất vẫn nên dùng function.

Sent from HUAWEI CLT-L29 using vozFApp
vì em code angular ấy thím, nó là ts, toàn class không thôi
 

cs_50i

Junior Member
Chia sẻ cách hiểu "this" trong JS em từng trải qua (cách học hơi vất tý):
1. Thay this bằng cách khác không dùng this để hiểu trong context ấy thì this nó có chức năng thế nào.
2. Hiểu this như một con pointer, nó xuất hiện ở đâu nghĩa là nó đang trỏ đến một cái gì đấy.
3. Phân biệt this trong từng trường hợp cụ thể. This trong method, this trong function, this đi kèm với các hàm như bind, call, apply
4. Xem this trong typescript ra sao thì xem file đã được biên dịch ra JS.
5. Cuối cùng là view source trên git những simple code xem ý tưởng các tác giả dùng this ra sao.

Kết quả: Mất mấy ngày cũng hiểu được this, khi dùng (có lẽ do chưa quen) nên bug tùm lum hết. Được cái dùng this rõ tiện. Nó như bàn tay di động, dùng nó để chỉ huy function, method of obj, kết nối obj các kiểu :p

_________
Ví dụ có this:

JavaScript:
class Timer {
 constructor(callback, interval){
    this.callback = callback;
    this.interval = interval;
    this.timerId = 0;
  }
 
 executeAndStartTimer(){
   this.callback().then(function startNewTimer(){
       this.timerId =
       setTimeout(this.executeAndStartTimer, this.interval);
   });
 }
   
 start(){
   if(this.timerId === 0){
     this.executeAndStartTimer();
   }
 }
 stop(){
   if(this.timerId !== 0){
     clearTimeout(this.timerId);
     this.timerId = 0;
   }
 }
}

const timer = new Timer(getTodos, 2000);
timer.start();
function getTodos(){
  console.log("call");
  return fetch("https://shopee.vn/api/v2/shop2323234");
}

K có this

Code:
function Timer(callback, interval){
  let timerId;
  function executeAndStartTimer(){
    callback().then(function makeNewCall(){
      timerId = setTimeout(executeAndStartTimer, interval);
    });
  }
  function stop(){
    if(timerId){
      clearTimeout(timerId);
      timerId = 0;
    }
  }
  function start(){
    if(!timerId){
      executeAndStartTimer();
    }
  }
  return Object.freeze({
    start,
    stop
  });
}

const timer = Timer(getTodos, 2000);
timer.start();
 
Last edited:
Top