Este problema parece ser cometido por muchas personas, pero todavía no sé lo suficiente sobre esto
Grabemos este problema ahora.
obj = {
a: 123,
b: this.a,
c: function () {
return this.a;
}
};
console.log(obj.b); // undefined
console.log(obj.c()); // 123
En pocas palabras, este es un problema de alcance b
. El esto en el atributo en realidad apunta al alcance principal, aquí está la ventana, y no definimos la variable a en la ventana. El esto en el atributo c apunta a obj, que es Porque el objeto en sí mismo no puede crear un ámbito, pero las funciones (métodos) pueden crear un ámbito local.
1. A continuación, primero agregamos a a la ventana, los resultados son los siguientes
var a = 5
obj = {
a: 123,
b: this.a,
c: function () {
return this.a;
}
};
console.log(obj.b); // 5
console.log(obj.c()); // 123
2. Si realmente desea obtener a en b, utilice la misma escritura que c
obj = {
a: 123,
b: function () {
return this.a;
},
c: function () {
return this.a;
}
};
console.log(obj.b()); // 123
console.log(obj.c()); // 123
3. A continuación, intentaremos cambiar el esto de b por obj
obj = {
a: 123,
b: obj.a,
};
console.log(obj.b);
Efectivamente, se informó un error.
4. Luego cambiamos el this de c a obj
obj = {
a: 123,
c: function () {
return obj.a;
}
};
console.log(obj.c()); // 123
Como era de esperar, se puede generar normalmente.
5. Finalmente, usamos la función de flecha para escribir el método. Se sabe que la función de flecha sin la suya propia heredará el alcance padre, que es window
obj = {
a: 123,
c: ()=>{
return this.a
}
};
console.log(obj.c()); // undefined
resumen:
1. El objeto en el entorno global es el mismo que la función en el entorno global, esto apunta a la ventana
2. Cuando se llama como un método de objeto, apunta al objeto que llamó al método
3. La función de flecha no tiene su propio esto, sigue siendo equivalente a un objeto global, y todavía apunta a la ventana