En JavaScript, si la función pertenece a un objeto, el comportamiento de acceder a la función a través del objeto se llama "llamada de método". A diferencia de las llamadas de la función ordinaria, al hacer una llamada de método, esta referencia en la función cambiará: esto se referirá al objeto utilizado para llamar a la función (este objeto se convertirá en el contexto de invocación de la llamada de método):
La copia del código es la siguiente:
var x = 99;
VAR muestra = {
x: 1,
ACT: Función (a) {
this.x = a*a; // Asignar valor a la X de la muestra, no el objeto global x.
}
}
muestra.act (6);
console.log (sample.x); // 36
console.log (x); // 99
Al igual que el acceso a las propiedades en objetos, además de usar operadores de DOT, JavaScript también puede usar operadores de soporte para hacer llamadas de método:
La copia del código es la siguiente:
// Otras formas de invocar el método
muestra ["acto"] (7);
console.log (sample.x); // 49
Para las funciones en JavaScript, un comportamiento interesante es incrustar las funciones (cierres) en las funciones. Al hacer una llamada de método, si hay una función incrustada en la función de método, el código en esta función integrada puede acceder al valor variable externo:
La copia del código es la siguiente:
// La función anidada puede acceder a una variable fuera de ella.
var y = 88;
var sample2 = {
Y: 1,
Act2: función (a) {
this.y = inner ();
function inner () {
devolver a*a;
}
}
}
muestra2.act2 (8);
console.log (sample2.y); // 64
console.log (y); // 88
Sin embargo, contrario a la intuición, el código integrado en la función no puede heredar esto desde el exterior; Es decir, en la función integrada, esto no se refiere al objeto que llama al método, sino al objeto global:
La copia del código es la siguiente:
// La función anidada no hereda "esto". El "esto" en la función anidada es el objeto global
var sample3 = {
act3: functer () {
interno();
function inner () {
console.log (this); // Objeto de ventana
}
}
}
muestra3.act3 ();
Si realmente necesita acceder al objeto que llama al método en la función incrustada, puede guardar este valor en una variable en la función externa:
La copia del código es la siguiente:
// pasar "esto" a la función anidada
var sample4 = {
act4: functer () {
var self = this;
interno();
function inner () {
console.log (self); // objeto {act4 = function ()}
}
}
}
muestra4.act4 ();