2010-07-09 23 views
21

Ho letto here che "auto si riferisce alla finestra corrente o al modulo".Che cosa significa "self" in javascript?

Sé non sembra fare riferimento alla forma attuale, in questo caso:

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

Tuttavia, in questo caso funziona (riferendosi alla finestra):

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

Così Quando volete utilizzare la proprietà DOM self su solo window?

+9

vorrei solo far notare che io non è una parola chiave, per evitare confusione. self è una proprietà della finestra (le proprietà sono membri di oggetti, le parole chiave sono essenzialmente ciò che costituisce il linguaggio di programmazione stesso, come "se" e "per") –

+0

Grazie per i chiarimenti. non ho mai usato js al di fuori del DOM. –

+17

Non fidarti mai di Goodie HTML, è ** terribile **. Fa sembrare W3Schools buono. – Quentin

risposta

8

Per tutte le finestre, i self e window proprietà di un oggetto window sono sinonimi per la finestra corrente e puoi scegliere di utilizzare per fare riferimento alla finestra corrente. Ad esempio, è possibile chiudere la finestra corrente tramite chiamando il metodo close di window o self. È possibile utilizzare queste proprietà per rendere il codice più leggibile o per distinguere il riferimento di proprietà self.status da un modulo status.

+0

quindi presumo auto == finestra. Il link che ho postato è molto fuorviante. Se quella è una citazione potresti pubblicare la fonte? –

+4

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

6

Mai, a meno che non ho voluto creare una variabile self nell'ambito di una funzione di riferimento al contesto di riferimento in seguito,

function Constructor() { 
    var self = this; 
} 

Si dovrebbe usare this per fare riferimento all'elemento a portata di mano, non self. Nell'ambito globale sebbene this è un riferimento a windowwindow.

9

self non è una parola chiave riservata o un tipo standard, ma è diventato un nome standard defacto quando per mantenere il riferimento a un oggetto per chiusure.

Qui viene creata una chiusura da passare a setTimeout(). Quando viene eseguita la chiusura, this farà riferimento all'oggetto globale. Per mantenere un riferimento all'oggetto foodoLater originariamente chiamato, viene utilizzata una variabile denominata self. Potrebbe essere tutto tranne che il "sé" ha una semantica significativa.

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

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

new Foo().doLater(); 
+1

Mentre funziona, suggerisco che la soluzione JavaScript più idiomatica sarebbe 'Foo.prototype.doLater = function() {setTimeout (function() {this.doSomething();} .bind (this), 1000); }; ' – ic3b3rg

12

Altro risposte hanno sottolineato che self non sta per fare riferimento alla FORM e che self è window. Hanno ragione; selfèwindow. Bene, tranne quando non lo è. In IE6 o IE7 (dimenticato), self.onload non sparava, anche se lo fosse window.onload.

Tutte le versioni ufficiali di IE (e anche IE9pr3) hanno un'implementazione dispari e intransitiva di == con questi oggetti host. Utilizzando == per confrontare window o self in un nodo nel documento, il risultato è true.

IE Stravaganti

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