2010-07-09 6 views
21

J'ai lu here que "auto fait référence à la fenêtre en cours ou formulaire".Que signifie "self" en javascript?

Self ne semble pas se référer à la forme actuelle dans ce cas:

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

Cependant, dans ce cas, il fonctionne (en référence à la fenêtre):

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

Quand voulez-vous utiliser la propriété DOM self sur juste window?

+9

Je voudrais simplement souligner que l'auto n'est pas un mot-clé, pour éviter toute confusion. self est une propriété de window (les propriétés sont des membres d'objets, les mots-clés sont essentiellement ce qui compose le langage de programmation lui-même, comme "if" et "for") –

+0

Merci pour la clarification. Je n'ai jamais utilisé js en dehors du DOM. –

+17

Ne faites jamais confiance à HTML Goodies, c'est ** horrible **. Cela fait que W3Schools a l'air bien. – Quentin

Répondre

8

Pour toutes les fenêtres, les self et window propriétés d'un objet sont window synonymes de la fenêtre en cours, et vous pouvez éventuellement les utiliser pour se référer à la fenêtre en cours. Par exemple, vous pouvez fermer la fenêtre en cours par en appelant la méthode close soit window ou self. Vous pouvez utiliser ces propriétés pour rendre votre code plus lisible ou à la référence désambiguïser propriété self.status d'une forme appelé status.

+0

donc je suppose auto == fenêtre. Le lien que j'ai posté est très trompeur. Si c'est une citation, pourriez-vous poster la source? –

+4

Source originale http://docs.sun.com/source/816-6408-10/window.htm. Source moderne http://dev.w3.org/html5/spec/Overview.html#dom-self – bobince

6

Jamais, à moins que je voulais créer une variable self dans le cadre d'une fonction faisant référence au contexte pour référence ultérieure,

function Constructor() { 
    var self = this; 
} 

Vous devez utiliser this pour faire référence à l'élément à portée de main, pas self. Dans la portée globale si this est une référence à window, et self est également window.

9

self n'est pas un mot-clé réservé ou type standard, mais est devenu un nom standard pour garder quand defacto référence à un objet pour les fermetures.

Ici, nous créons une fermeture pour passer à setTimeout(). Lorsque cette fermeture est exécutée, this fera référence à l'objet global. Pour conserver une référence à l'objet foodoLater a été appelé à l'origine, une variable nommée self est utilisée. Cela pourrait être n'importe quoi mais le 'soi' a une sémantique significative.

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

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

new Foo().doLater(); 
+1

Bien que cela fonctionne, je suggère que la solution JavaScript plus idiomatique serait 'Foo.prototype.doLater = function() {setTimeout (function() {this.doSomething();} .bind (this), 1000); }; ' – ic3b3rg

12

D'autres réponses ont souligné que self ne va pas se référer à la FORM et que self est window. Ils ont raison. selfestwindow. Eh bien, sauf quand ce n'est pas le cas. Dans IE6 ou IE7 (oublié), self.onload ne se déclencherait pas, bien que window.onload le ferait.

Toutes les versions officielles de IE (et même IE9pr3) ont une implémentation étrange et intransitive de == avec ces objets hôtes. En utilisant == pour comparer window ou self à un nœud dans le document, le résultat est true.

IE Bizarreries

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