Significado de "esto" en los módulos y funciones de node.js

Resuelto Gökçer Gökdal asked hace 10 años • 4 respuestas

Tengo un archivo JavaScript cargado por require.

// loaded by require()

var a = this; // "this" is an empty object
this.anObject = {name:"An object"};

var aFunction = function() {
    var innerThis = this; // "this" is node global object
};

aFunction();

(function(anyParameter){
    console.log(anyParameter.anObject);
})(
    this // "this" is same having anObject. Not "global"
);

Mi pregunta es: thisen var a = this;es un objeto vacío, mientras que thislas declaraciones en funciones son sombras del objeto global de node.js. Sé que thisla palabra clave es diferente en funciones, pero no podía entender por qué primero thisno es igual a global y thisen funciones es igual a global.

¿Cómo se inyecta node.js globalen thislos alcances de las funciones y por qué no lo inyecta en el alcance del módulo?

Gökçer Gökdal avatar Apr 01 '14 02:04 Gökçer Gökdal
Aceptado

Aquí hay algunos hechos fundamentales que debe comprender para aclarar la situación:

  • En el código de nivel superior de un módulo de Nodo, thisequivale a module.exports. Ese es el objeto vacío que ves.

  • Cuando se usa thisdentro de una función, el valor de thisse determina nuevamente antes de cada ejecución de la función, y su valor se determina por cómo se ejecuta la función . Esto significa que dos invocaciones del mismo objeto de función podrían tener thisvalores diferentes si los mecanismos de invocación son diferentes (por ejemplo, aFunction()vs. aFunction.call(newThis)vs. emitter.addEventListener("someEvent", aFunction);, etc.). En su caso, aFunction()en modo no estricto ejecuta la función thisconfigurada en el objeto global.

  • Cuando los archivos JavaScript se requireguardan como módulos de Node, el motor de Node ejecuta el código del módulo dentro de una función contenedora. Esa función de ajuste de módulo se invoca con un thisconjunto en module.exports. (Recuerde, arriba, una función se puede ejecutar con un thisvalor arbitrario).

Por lo tanto, obtienes thisvalores diferentes porque cada uno thisreside dentro de una función diferente: el primero está dentro de la función contenedora del módulo creada por el nodo y el segundo está dentro de aFunction.

apsillers avatar Mar 31 '2014 20:03 apsillers

Para comprender esto, debe comprender que Node.js en realidad envuelve el código de su módulo en una función, como esta

(function (exports, require, module, __filename, __dirname) {
    var test = function(){
        console.log('From test: '  + this);
    };
    console.log(this);
    test();
});

Se puede encontrar una explicación detallada en esta respuesta .


Ahora, esta función envuelta se invoca así

var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

Entonces, thisa nivel de módulo, es en realidad el exportsobjeto.

Puedes confirmarlo así.

console.log(this, this === module.exports);
// {} true
thefourtheye avatar Jun 17 '2015 14:06 thefourtheye