Apuntar esto en el subprograma WeChat y cambiar el apuntar de este

He resumido el contexto de la función esto antes  

Aquí hay una breve charla sobre este punto involucrado en el subprograma y cómo cambiar este punto.

el punto de esto

Visión de conjunto

En JavaScript esta es una palabra clave específica, siempre apunta a un objeto, y esto también tiene un significado especial, llamado contexto de ejecución, que representa al ejecutor de la función. para resumir

  • esto se refiere a un objeto
  • El punto de esto solo está relacionado con la ejecución de la función y no tiene nada que ver con la definición de la función.

Esto bajo el global

  • Esto bajo el punto global a la ventana.
//window
console.log( this )
function fn () {
    console.log( this )
}
//window
fn()

Esto en el método del objeto

Las funciones se pueden utilizar como transferencia y retorno de valor en js, así como objetos y constructores. Todas las funciones necesitan determinar su entorno operativo actual cuando se ejecutan, y este nace. Por lo tanto, esto cambiará de acuerdo con los cambios en el entorno operativo. Al mismo tiempo, esto en la función solo puede finalizar el entorno operativo en tiempo de ejecución. El resumen anterior se resume en una oración:

  • Esto en la función solo puede determinar el punto de esto en tiempo de ejecución, y el punto de esto no se puede determinar cuando se define la función.
function fn () {
    console.log(this.a)
}
var obj = {
    a:12,
    fn:fn
}
var a = 22
//12
obj.fn()
//22
fn()

El ejecutor de la función fn en obj.fn () es obj, por lo que el obj al que apunta esta función imprimirá 12. Mientras se ejecuta fn (), su ejecutor es la ventana, por lo que a impreso en la función es una ventana inferior, por lo que el resultado impreso es 22

var A = {
    name: 'zhangsan',
    f: function () {
        console.log('姓名:' + this.name);
    }
};
var B = {
    name: 'lisi'
};

B.f = A.f;
B.f()   
A.f() 

Cuando se ejecuta Bf (), su ejecutor es el objeto B, por lo que se imprime "lisi". Cuando se ejecuta Af (), su ejecutor es A, por lo que se imprime "zhangsan". A través del resumen del caso anterior

  • Cuando se ejecuta la función, observe si hay un punto (.) Delante de ella. Si es un bit, entonces el ejecutor de la función es el objeto delante de ella, y si no hay un punto, el ejecutor de la función es ventana
function foo() {
    console.log(this.a);
}
var obj2 = {
    a: 2,
    fn: foo
};
var obj1 = {
    a: 1,
    o1: obj2
};
obj1.o1.fn(); // 2

Quién es el ejecutor de la función, entonces quién es este en la función. Para este caso, la operación puntual continua adopta el principio de proximidad, entonces el ejecutor de la función es o1, y o1 en sí mismo es el objeto de obj2, por lo que este en la función apunta a obj2, por lo que el resultado es 2.

Durante el proceso de desarrollo, existen aproximadamente cinco problemas comunes:

  1. Método en objeto
  2. Enlace de eventos
  3. Constructor
  4. Temporizador
  5. Los métodos call () y apply () de los objetos de función

Cómo cambiar este punto

Resuelva este punto declarando variables de antemano.

var a = 3
var obj1 = {
    a:1
}
var obj2 = {
    a:2,
    fn:function(){
        var that = this
        setTimeout(function(){
            console.log(that.a)	
        },0)
    }
}
obj2.fn() //1

Resuelva este problema puntual a través de funciones de llamada y aplicación

var obj = {
    a:1
}
var obj2 = {
    a:2,
    fn:function(){
        console.log(this.a)	
    }
}
obj2.fn.call(obj) //1

var obj = {
    a:1
}
var obj2 = {
    a:2,
    fn:function(){
        console.log(this.a)	
    }
}
obj2.fn.apply(obj) //1

Modifique este punto utilizando la función bind () al final de la función al definir la función.

var obj = {
    a:1
}
var obj2 = {
    a:2,
    fn:function(){
        console.log(this.a)	
    }.bind(obj)
}
obj2.fn() //1

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_41040445/article/details/114401112
Recomendado
Clasificación