He estado jugando con node.js últimamente y me encontré con un comportamiento extraño sobre el uso de this
en el alcance global de un módulo.node.js: Uso confuso de 'esto' en el ámbito global
this
está obligado a module.exports en el ámbito global:
console.log(this === exports); // -> true
Pero this
está obligado a global en un ámbito de método:
(function() { console.log(this === global); })(); // -> true
Esto también conducen a este comportamiento confuso:
this.Foo = "Weird";
console.log(Foo); // -> throws undefined
(function() { this.Bar = "Weird"; })();
console.log(Bar); // -> "Weird"
Supongo que la solución es t o nunca use this
en el alcance global y explícitamente use extends
o global
en su lugar, pero ¿hay una lógica detrás de todo esto o es un error o una limitación en node.js?
¿No sería menos confuso si 'this' en el alcance global estuviera ligado a' global' en vez de 'extends' entonces? Esperaría que "esto" significara lo mismo en el ámbito global y en el alcance de una función estática. –
@SelflessCoder: Honestamente, no sé por qué esto está ligado al objeto 'exports'. Pero, en general, es una buena idea NO derrotar al objeto global con datos. Por lo tanto, solo tenga en cuenta que cualquier contexto de función puede tener un valor 'this' diferente, dependiendo de cómo se llame. – jAndy
Como dice jAndy, esto es básicamente cómo 'this' funciona en javascript. No he leído ninguna discusión al respecto, pero supongo que tener 'this === exports' en alcance global se supone que es análogo a' this === window' en el alcance global de un navegador. IMO, teniendo 'this === global' en alcance global tiene menos sentido, ya que eso significaría que' this.foo === foo'. –