Bajo alcance global
este;
Al usar esto en un alcance global, apunta a un objeto global.
Aquí hay una introducción detallada al objeto global:
Global Object es un objeto que se ha creado antes de ingresar cualquier contexto de ejecución;
Solo hay una copia de este objeto, y se puede acceder a sus propiedades en cualquier parte del programa. El ciclo de vida del objeto global termina en el momento en que el programa sale.
En la etapa de creación inicial del objeto global, las matemáticas, la cadena, la fecha, el parseint se inicializan como sus propios atributos, etc., y otros objetos adicionales también se pueden crear como atributos (que pueden señalar el objeto global en sí). Por ejemplo, en el DOM, la propiedad de la ventana del objeto global puede referirse al objeto global en sí.
Entonces es lo mismo que este.
Al llamar a una función
foo ();
Aquí, esto también apunta al objeto global.
Al llamar a un método
test.foo ();
En este ejemplo, esto apuntará al objeto de prueba.
Al llamar a un constructor
nuevo foo ();
Se usa una función con la palabra clave nueva cuando se le llame, que llamamos un constructor. En este momento, dentro de la función, esto apunta al objeto recién creado.
Cuando se establece explícitamente
función foo (a, b, c) {} // var bar = {}; foo.apply (bar, [1, 2, 3]); // La matriz se expandirá a la siguiente. Call (bar, 1, 2, 3); // da como resultado a = 1, b = 2, c = 3Al usar los métodos de aplicación y llamadas de funciones.
Por lo tanto, a diferencia de las reglas al llamar a una función, esto en el ejemplo anterior apunta a la barra.
Aquí están los métodos de llamada y aplicación:
Método de llamadas :
Sintaxis: call ([thisObj [, arg1 [, arg2 [, [, .argn]]]]])
Definición: llame a un método de un objeto para reemplazar el objeto actual con otro objeto.
Aplicar método :
Sintaxis: aplicar ([thisObj [, argararray]])
Definición: aplique un método de cierto objeto y reemplace el objeto actual con otro objeto.
Aquí debemos tener en cuenta que esto no se puede usar para señalar el objeto en sí cuando el objeto se declara literalmente. como sigue:
var obj = {me: this}Aquí, esto no apuntará a OBJ, y la aplicación de esto se limita a las cinco situaciones anteriores.
Resumir
Aunque la situación anterior es principalmente significativa, esto en el segundo caso (es decir, al llamar a una función) en realidad rara vez es útil, lo que se considera otro error en el diseño de JavaScript.
Foo.method = function () {function test () {// Esto se establece en el objeto global} test ();}Como mencionamos anteriormente, esto aquí señalará el objeto global, no a la función FOO.
Para obtener una forma de apuntar a Foo en la prueba, necesitamos crear una variable local dentro del método que apunte a Foo.
Foo.method = function () {var that = this; función test () {// use eso en lugar de esto aquí} test ();}Ese es solo un nombre de variable normal, pero a menudo se usa para señalar a este externo.
Hay otra cosa interesante relacionada con el alias de funciones, es decir, cuando se asigna un método a una variable.
var test = someObject.methodTest; test ();
En el ejemplo anterior, la prueba se tratará como una función normal, por lo que de acuerdo con el segundo caso (es decir, cuando se llama una función), esta dentro apuntará a una variable global, no a algún objeto.
Aunque esta vinculación tardía parece una mala decisión al principio, en realidad es la base de la herencia prototipo.
function foo () {} foo.prototype.method = function () {}; function bar () {} bar.prototype = foo.prototype; new Bar (). Method ();En este punto, cuando se llama método, apuntará al objeto de instancia de la barra.