¿Qué significa "self" en javascript?


Leo aquíque " self Se refiere a la ventana o forma actual".

Self no parece referirse a la forma actual en este caso:

<form><input type="text" onkeyup="alert(self.foo.value)" name="foo"></form>

Sin embargo en este caso funciona (refiriéndose a la ventana):

<form><input type="text" onkeyup="alert(self.document.forms[0].foo.value)" name="foo"></form>

Entonces, ¿cuándo usarías la propiedad self DOM sobre solo window?

Author: laconbass, 2010-07-10

5 answers

Para todas las ventanas, el self y window las propiedades de un objeto window son sinónimos de la ventana actual, y opcionalmente puede usarlos para referir a la ventana actual. Por ejemplo, puede cerrar la ventana actual llamando al método close de cualquiera window o self. Puedes usar estos propiedades para hacer tu código más legible o para desambiguar el referencia de propiedad self.status de a formulario llamado status.

 9
Author: Swift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 07:18:33

Otras respuestas han señalado que self no va a referirse al FORM y que self es window. Tienen razón; self es window. Bueno, excepto cuando no lo es. En IE6 o IE7 (olvidado), self.onload no dispararía, aunque window.onload lo haría.

Todas las versiones oficiales de IE (e incluso IE9pr3) tienen una implementación intransitiva e impar de == con estos objetos host. Usando == para comparar window o self con un nodo en el documento, el resultado es true.

es decir Rarezas

alert(self == document.body); // true
alert(document.body == self); // false
alert(window == self); // true
alert(window === self); //false
var b = document.createElement("b");
alert(window == b); // false
alert(window == document.body.appendChild(b)); // true
alert(window == document.body.removeChild(b)); // false
 12
Author: Garrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-10 05:03:25

self no es una palabra clave reservada o un tipo estándar, pero se ha convertido en un nombre estándar predeterminado para mantener la referencia a un objeto para cierres.

Aquí creamos un cierre para pasar a setTimeout(). Cuando se ejecuta ese cierre, this se referirá al objeto global. Para mantener una referencia al objeto foo en el que se invocó originalmente doLater, se usa un var llamado self. Podría ser cualquier cosa, pero el ' yo ' tiene una semántica significativa.

Foo.prototype.doLater = function() {
  var self = this; // current object

  window.setTimeout(function() { self.doSomething(); }, 1000);
}

new Foo().doLater();
 9
Author: Chadwick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-09 20:55:07

Nunca, a menos que quisiera crear una variable self en el ámbito de una función que se refiera al contexto para una referencia posterior,

function Constructor() {
    var self = this;
}

Debe usar this para referirse al elemento en cuestión, no self. En el ámbito global, this es una referencia a window, y self es también window.

 6
Author: meder omuraliev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-09 20:48:51

Self se refiere al ámbito global - Si el contexto es una ventana, se referirá a ventana.self, mientras que en el caso de un contexto no ventana se referirá al ámbito global de ese contexto (por ejemplo, en el código del trabajador de servicios, self se refiere al ámbito global del trabajador).

Self se refiere al ámbito global de un contexto:

  • contexto de ventana
  • contexto del trabajador (se está trabajando el soporte para varios trabajadores para la misma aplicación web en).

Https://developer.mozilla.org/en-US/docs/Web/API/Window/self

 2
Author: MyUserInStackOverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-25 22:52:57