const person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the <b>person</b> object.</p>
<p>Because <b>fullName</b> is a method of the person object.</p>
<p id="demo"></p>
<script>
// Create an object:
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
// Display data from the object:
document.getElementById("demo").innerHTML = person.fullName();
</script>
</body>
</html>
Em JavaScript, a palavra-chave this
refere-se a um objeto.
Qual objeto depende de como este
está sendo invocado (usado ou chamado).
A palavra-chave this
refere-se a diferentes objetos dependendo de como é usada:
Em um método de objeto, this
refere-se ao objeto.
Sozinho, isto
refere-se ao objeto global.
Em uma função, this
refere-se ao objeto global.
Em uma função, no modo estrito, isso
é indefinido
.
Em um evento, this
refere-se ao elemento que recebeu o evento.
Métodos como call()
, apply()
e bind()
pode referir isto
a qualquer objeto.
isso
não é uma variável. É uma palavra-chave. Você não pode alterar o valor de isto
.
Quando usado em um método de objeto, this
refere-se ao objeto.
No exemplo no topo desta página, this
refere-se ao objeto person.
Porque o método fullName é um método do objeto person.
fullName : function() {
return this.firstName + " " + this.lastName;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the <b>person</b> object.</p>
<p>Because <b>fullName</b> is a method of the person object.</p>
<p id="demo"></p>
<script>
// Create an object:
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
// Display data from the object:
document.getElementById("demo").innerHTML = person.fullName();
</script>
</body>
</html>
Quando usado sozinho, this
refere-se ao objeto global.
Porque isso
está sendo executado no escopo global.
Em uma janela do navegador, o objeto global é [object Window]
:
let x = this;
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the window object:</p>
<p id="demo"></p>
<script>
let x = this;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
No modo estrito, quando usado sozinho, this
também se refere ao objeto global:
"use strict";
let x = this;
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the window object:</p>
<p id="demo"></p>
<script>
"use strict";
let x = this;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
Em uma função, o objeto global é a ligação padrão para this
.
Em uma janela do navegador, o objeto global é [object Window]
:
function myFunction() {
return this;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the the window object:</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = myFunction();
function myFunction() {
return this;
}
</script>
</body>
</html>
O modo estrito do JavaScript não permite vinculação padrão.
Portanto, quando usado em uma função, no modo estrito, isso
é indefinido
.
"use strict";
function myFunction() {
return this;
}
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In a function, by default, <b>this</b> refers to the global object.</p>
<p>Strict mode does not allow default binding, so <b>this</b> is:</p>
<p id="demo"></p>
<script>
"use strict";
document.getElementById("demo").innerHTML = myFunction();
function myFunction() {
return this;
}
</script>
</body>
</html>
Em manipuladores de eventos HTML, this
refere-se ao elemento HTML que recebeu o evento:
<button onclick="this.style.display='none'">
Click to
Remove Me!
</button>
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<button onclick="this.style.display='none'">Click to Remove Me!</button>
</body>
</html>
Nestes exemplos, este
é o objeto pessoa:
const person = {
firstName : "John",
lastName : "Doe",
id : 5566,
myFunction : function() {
return this;
}
};
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the <b>person object</b>.</p>
<p id="demo"></p>
<script>
// Create an object:
const person = {
firstName : "John",
lastName : "Doe",
id : 5566,
myFunction : function() {
return this;
}
};
// Display data from the object:
document.getElementById("demo").innerHTML = person.myFunction();
</script>
</body>
</html>
const person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " +
this.lastName;
}
};
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example, <b>this</b> refers to the <b>person</b> object.</p>
<p>Because <b>fullName</b> is a method of the person object.</p>
<p id="demo"></p>
<script>
// Create an object:
const person = {
firstName: "John",
lastName: "Doe",
id: 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
// Display data from the object:
document.getElementById("demo").innerHTML = person.fullName();
</script>
</body>
</html>
ou seja, this.firstName é a propriedade firstName de this (o objeto person).
Os métodos call()
e apply()
são métodos JavaScript predefinidos.
Ambos podem ser usados para chamar um método de objeto com outro objeto como argumento.
O método de chamada de função()
O método da função apply()
O método da função bind()
O exemplo abaixo chama person1.fullName com person2 como argumento, this refere-se a person2, mesmo que fullName seja um método de person1:
const person1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
const person2 = {
firstName:"John",
lastName: "Doe",
}
// Return "John Doe":
person1.fullName.call(person2);
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>The JavaScript <i>this</i> Keyword</h1>
<p>In this example <strong>this</strong> refers to person2, even if it is a method of person1:</p>
<p id="demo"></p>
<script>
const person1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
const person2 = {
firstName:"John",
lastName: "Doe",
}
let x = person1.fullName.call(person2);
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
Com o método bind()
, um objeto pode pegar emprestado um método de outro objeto.
Este exemplo cria 2 objetos (pessoa e membro).
O objeto membro pega emprestado o método fullname do objeto person:
const person = {
firstName:"John",
lastName: "Doe",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
const member = {
firstName:"Hege",
lastName: "Nilsen",
}
let fullName = person.fullName.bind(member);
Experimente você mesmo →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Function bind()</h1>
<p>This example creates 2 objects (person and member).</p>
<p>The member object borrows the fullname method from person:</p>
<p id="demo"></p>
<script>
const person = {
firstName:"John",
lastName: "Doe",
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
const member = {
firstName:"Hege",
lastName: "Nilsen",
}
let fullName = person.fullName.bind(member);
document.getElementById("demo").innerHTML = fullName();
</script>
</body>
</html>
Para determinar a qual objeto este
se refere; use a seguinte precedência de ordem.
Objeto
vincular()
aplicar() e chamar()
Método de objeto
Âmbito global
isso
está em uma função que está sendo chamada usando bind()?
isso
está em uma função que está sendo chamada usando apply()?
isto
está em uma função sendo chamada usando call()?
isso
está em uma função de objeto (método)? <p>isto
está em uma função no escopo global.