JavaScript: apa itu "ini"?

Dec 13 2022
Halo , Pada artikel ini, kami akan mencoba menjelaskan kemungkinan nilai yang berbeda dari kata kunci this tergantung pada konteks penggunaannya dalam JavaScript. Lingkup global Dalam lingkup global, ini mengacu pada objek global (jendela di web dan global di Node.js).

Halo ,

Pada artikel ini, kami akan mencoba menjelaskan berbagai kemungkinan nilai thiskata kunci tergantung pada konteks penggunaannya dalam JavaScript.

Cakupan global

Dalam lingkup global, thismengacu pada objek global ( windowdi web dan globaldi Node.js).

globalThisjuga dapat digunakan sebagai cara independen platform untuk mencapai objek global.

// global scope (web)

console.log(this === window); // true
console.log(this === globalThis); // true

Di dalam fungsi non-panah, nilai thisakan bergantung pada bagaimana fungsi tersebut dipanggil.

Disebut sebagai fungsi mandiri

  • Dalam mode non-ketat , mengacu pada objek global: this
  • function getThis() {
      return this;
    }
    
    console.log(getThis() === globalThis); // true
    

    "use strict"
    
    function getThis() {
      return this;
    }
    
    console.log(getThis() === undefined); // true
    

const bar = {
  getThis: function() {
    return this;
  }
};

console.log(bar.getThis() === bar); // true

const baz = {};
baz.getThis = bar.getThis;

console.log(baz.getThis() === baz); // true

// Called as a standalone function
const getThis = bar.getThis;
console.log(getThis() === globalThis); // true (`false` in strict mode)

Metode kelas berperilaku dengan cara yang sama dari metode dalam objek literal.

Fungsi panah

Di dalam fungsi panah, nilai this sama dengan salah satu dari konteks leksikal terlampir .

Dengan kata lain, saat mengevaluasi fungsi panah, mesin JS tidak membuat thisikatan baru tetapi menggunakan yang tersedia di lingkup sekitarnya :

// (1) `this` equals to `globalThis` here

const foo = {
  getThis: () => this
};

console.log(foo.getThis() === foo); // false
console.log(foo.getThis() === globalThis); // true (1)
// (1) `this` equals to `globalThis` here

const bar = {
  getArrowFn: function() {
    // (2) `this` equals to `bar` or `baz` here 
    // depending on how the function is called below
    
    return () => this;
  }
};

console.log(bar.getArrowFn()() === bar); // true (2)
console.log(bar.getArrowFn()() === globalThis); // false (1)

const baz = {};
baz.getArrowFn = bar.getArrowFn;

console.log(baz.getArrowFn()() === baz); // true (2)
console.log(baz.getArrowFn()() === globalThis); // false (1)

Konstruktor fungsi

Di dalam fungsi yang digunakan sebagai konstruktor (dengan newkata kunci), thisterikat ke objek baru yang sedang dibangun, tidak peduli bagaimana fungsi diakses:

function Bar() {
  this.baz = 42;
}

let a = new Bar();
console.log(a.baz); // 42
const bar = {
  baz: function() {
    this.foo = 42;
  }
};

let a = new bar.baz();
console.log(a.foo); // 42
console.log(bar.foo); // undefined

function Bar() {
  this.baz = 42;
  return { baz: 44 };
}

let a = new Bar();
console.log(a.baz); // 44 (not 42)

terapkan(), panggil()

Metode call()and apply()dapat digunakan untuk secara eksplisit mengatur nilai this dalam fungsi non-panah:

function getThis() {
  return this;
}

const bar = {
  getThis: function() {
    return this;
  }
};

console.log(getThis() === globalThis); // true
console.log(bar.getThis() === bar); // true

const myThis = {};

console.log(getThis.call(myThis) === myThis); // true
console.log(getThis.apply(myThis) === myThis); // true

console.log(bar.getThis.call(myThis) === myThis); // true
console.log(bar.getThis.apply(myThis) === myThis); // true

Saat digunakan pada fungsi panah, thisparameter diabaikan (meskipun Anda masih bisa meneruskan argumen fungsi menggunakan metode ini):

// (1) `this` equals to `globalThis` here

const getThis = () => this;

console.log(getThis() === globalThis); // true

const myThis = {};

console.log(getThis.call(myThis) === globalThis); // true
console.log(getThis.apply(myThis) === globalThis); // true

Fungsi bind()ini digunakan untuk membuat fungsi baru yang terikat pada objek tertentu.

Ini berarti bahwa ketika fungsi baru dipanggil, thiskata kunci akan merujuk ke objek yang terikat padanya:

function getThis() {
  return this;
}

console.log(getThis() === globalThis); // true

const myThis = {};
const getMyThis = getThis.bind(myThis);

console.log(getMyThis() === myThis); // true
console.log(getMyThis.call(globalThis) === myThis); // true
console.log(getMyThis.apply(globalThis) === myThis); // true

Saat digunakan pada fungsi panah, thisparameter diabaikan (meskipun Anda masih bisa meneruskan argumen fungsi menggunakan metode ini):

// (1) `this` equals to `globalThis` here

const getThis = () => this;

console.log(getThis() === globalThis); // true

const myThis = {};
const getMyThis = getThis.bind(myThis);

console.log(getMyThis() === globalThis); // true
console.log(getMyThis.call(myThis) === globalThis); // true
console.log(getMyThis.apply(myThis) === globalThis); // true