¿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
?
5 answers
Para todas las ventanas, el
self
ywindow
las propiedades de un objetowindow
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étodoclose
de cualquierawindow
oself
. Puedes usar estos propiedades para hacer tu código más legible o para desambiguar el referencia de propiedadself.status
de a formulario llamadostatus
.
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
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();
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
.
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
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