Este objeto siempre ha sido una trampa en JS, y es difícil juzgar a qué señala. A menudo cometemos este tipo de errores debido a nuestra experiencia de C ++ o Python. A continuación, hablemos sobre la propiedad de este objeto en detalle.
Regla1: Esto en el entorno global
El entorno de JavaScript está inherentemente determinado por funciones. En JS, el contexto no puede separarse por bloques de código. El entorno que no está envuelto por funciones es el entorno global. Esto en el entorno global apunta a la ventana variable global. Ver el siguiente ejemplo
La copia del código es la siguiente:
var name = 'jjj';
console.log (this.name);
// El JJJ se emitirá con éxito
Regla2: Esto cuando se llama como método
Obviamente, esta situación es fácil de juzgar, es consistente con uno mismo en Python. Esto indudablemente apunta al objeto que llama al método
La copia del código es la siguiente:
user var = {
Nombre: 'Kkk'
};
user.getName = function () {
console.log (this.name);
};
user.getName ();
// La salida KKK se emitirá
Regla3: Esto cuando es como constructor
No necesito decir mucho sobre esto en este momento. Obviamente apunta al objeto recién creado. La operación del constructor en realidad no crea un objeto, sino que es solo la inicialización. El objeto se crea antes de ejecutarlo.
Aquí hay algunos ejemplos
La copia del código es la siguiente:
Usuario de funciones (nombre) {
this.name = name;
}
var f1 = nuevo usuario ('kkk');
var f2 = user ('kkk');
console.log (f1.name); // kkk
console.log (f2.name); // Undefined no tiene un atributo de nombre
Regla4: esta llamada indirecta
La llamada llamada indirecta se refiere a usar las funciones de aplicar y llamar a la llamada, y esto señala el primer parámetro en su lista de parámetros.
La copia del código es la siguiente:
var setName = function (name) {
this.name = name;
};
Var user = {nivel: 2};
user.apply (setname, 'jjj');
console.log (user.name); // jjj
Regla 5: Esto en otros casos
Recuerde que esto no se cambiará en otras situaciones, y este también es el lugar más fácil para cometer errores.
La copia del código es la siguiente:
var name = "Coder inteligente";
Var Person = {
Nombre: "Foocoder",
Hola: function (Sth) {
var sayshello = function (Sth) {
console.log (this.name + "dice" + sth);
};
Sayhello (Sth);
}
}
Person.hello ("Hello World"); // Coder inteligente dice hola mundo
El código anterior parece extraño, ¿no debería este punto a persona?
Debemos recordar que esto en la función anidada no apuntará a la función que la anuda. En este ejemplo, esto en Sayshello no apuntará a la función correspondiente a Hello. Si cambiamos ligeramente el ejemplo
La copia del código es la siguiente:
Hola: function (Sth) {
console.log (this.name + "dice" + sth);
}
// foocoder dice hola mundo
Todos deberían haber entendido que en este momento, Sayhello no está llamando como un método, por lo que esto apunta al objeto global. . .
En este momento, el problema es que el ejemplo inicial de usar el nodo para ejecutar se mostrará indefinido de Hello World. Me pregunto si hay algún maestro para explicarlo.
Regla 6: Eval rompe todas las reglas
Finalmente termina con un ejemplo
La copia del código es la siguiente:
var name = "Coder inteligente";
user var = {
Nombre: 'Kkk'
};
user.getName = function () {
console.log (this.name);
};
var get = user.getName;
Get (); // Coder inteligente
¿Lo entiendes?