No JavaScript, se a função pertence a um objeto, o comportamento de acessar a função através do objeto é chamado de "Chamada do método". Diferentemente das chamadas de função comum, ao fazer uma chamada de método, essa referência na função mudará - isso se referirá ao objeto usado para chamar a função (esse objeto se tornará o contexto de invocação da chamada do método):
A cópia do código é a seguinte:
var x = 99;
var amostra = {
x: 1,
ato: função (a) {
this.x = a*a; // atribui valor ao x da amostra, não x do objeto global.
}
}
sample.act (6);
console.log (sample.x); // 36
console.log (x); // 99
Como acessar propriedades em objetos, além de usar operadores de pontos, o JavaScript também pode usar operadores de suporte para fazer chamadas de método:
A cópia do código é a seguinte:
// Outras maneiras de invocar o método
amostra ["Act"] (7);
console.log (sample.x); // 49
Para funções no JavaScript, um comportamento interessante é incorporar funções (fechamentos) nas funções. Ao fazer uma chamada de método, se houver uma função incorporada na função do método, o código nesta função incorporada pode acessar o valor da variável externa:
A cópia do código é a seguinte:
// A função aninhada pode acessar a variável fora dela.
var y = 88;
var amostra2 = {
y: 1,
ACT2: function (a) {
this.y = interno ();
função interna () {
retornar a*a;
}
}
}
amostra2.Act2 (8);
console.log (sample2.y); // 64
console.log (y); // 88
No entanto, ao contrário da intuição, o código incorporado na função não pode herdar isso de fora; Ou seja, na função incorporada, isso não se refere ao objeto que chama o método, mas para o objeto global:
A cópia do código é a seguinte:
// A função aninhada não herda "this". O "This" na função aninhada é objeto global
var sample3 = {
Act3: function () {
interno();
função interna () {
console.log (this); // objeto de janela
}
}
}
sample3.Act3 ();
Se você realmente precisa acessar o objeto que chama o método na função incorporada, você pode salvar esse valor em uma variável na função externa:
A cópia do código é a seguinte:
// Passe "this" para a função aninhada
var amostra4 = {
Act4: function () {
var self = this;
interno();
função interna () {
console.log (self); // objeto {Act4 = function ()}
}
}
}
sample4.Act4 ();