JavaScript: o que é “isso”?

Dec 13 2022
Olá , Neste artigo, tentaremos explicar os diferentes valores possíveis da palavra-chave this dependendo do contexto em que ela é usada em JavaScript. Escopo global No escopo global, refere-se ao objeto global (janela na web e global no Node.

Olá ,

Neste artigo, tentaremos explicar os diferentes valores possíveis da palavra- thischave dependendo do contexto em que ela é usada em JavaScript.

Âmbito global

No escopo global, thisrefere-se ao objeto global ( windowna web e globalno Node.js).

globalThistambém poderia ser usado como uma forma independente de plataforma de alcançar o objeto global.

// global scope (web)

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

Dentro de uma função não seta, o valor de thisdependerá de como a função é chamada.

Chamado como uma função autônoma

  • No modo não restrito , refere-se ao objeto 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)

Os métodos de classe se comportam da mesma maneira que os métodos em literais de objeto.

funções de seta

Dentro de uma função de seta, o valor de this é igual ao do contexto léxico envolvente .

Em outras palavras, ao avaliar uma função de seta, o mecanismo JS não cria um novo thisvínculo, mas usa aquele disponível no escopo circundante :

// (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)

Construtores de funções

Dentro de uma função usada como construtor (com a palavra- newchave), thisestá vinculado ao novo objeto que está sendo construído, não importa como a função seja acessada em:

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)

aplicar(), chamar()

Os métodos call()e apply()podem ser usados ​​para definir explicitamente o valor de this em funções que não são setas:

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

Quando usado em uma função de seta, o thisparâmetro é ignorado (você ainda pode passar argumentos de função usando esses métodos):

// (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

A bind()função é usada para criar uma nova função vinculada a um determinado objeto.

Isso significa que, quando a nova função for chamada, a thispalavra-chave se referirá ao objeto ao qual está vinculada:

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

Quando usado em uma função de seta, o thisparâmetro é ignorado (você ainda pode passar argumentos de função usando esses métodos):

// (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