2013-06-01 14 views
47

Ognuno è consapevole di this in javascript, ma ci sono anche casi di self incontrati in natura, come ad esempio heredifferenza tra questo e l'auto in JavaScript

Quindi, qual è la differenza tra this e self in JavaScript?

+1

[E riguardo a questa] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) ... –

+6

@dystroy: C'è una sola: [ ' window.self'] (https://developer.mozilla.org/en-US/docs/Web/API/window.self) ('=== window'). Anche se l'OP probabilmente significa un nome variabile banale ... – Bergi

+0

Oh, questo tu pensi? Beh ... forse dovresti rispondere allora. –

risposta

55

A meno che altrove impostare, il valore di self è window perché JavaScript consente di accedere a qualsiasi proprietà x di window come semplicemente x, invece di window.x. Pertanto, self è in realtà window.self, che è diverso da this.

window.self === window; // true 

Se stai usando una funzione che viene eseguita in ambito globale e non è in modalità rigorosa, this default window, e quindi

function foo() { 
    console.log(
     window.self === window, // is self window? 
     window.self === this, // is self this? 
     this === window   // is this window? 
    ); 
} 
foo(); // true true true 

Se si utilizza una funzione in un contesto diverso, this farà riferimento a tale contesto, ma self sarà ancora window.

// invoke foo with context {} 
foo.call({}); // true false false 

Potete trovare window.self definito nella W3C 2006 working draft for the Window Objecthere.

+9

Per completezza, '' self'' è utile nel contesto di WebWorker quando la finestra non è accessibile (https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/ Using_web_workers). L'uso di '' self'' invece di '' window'' consente di accedere all'oggetto globale in modo portatile. – lqc

16

Anche se sono in ritardo qui, ma mi sono imbattuto in un esempio, che troppo può essere utile per capire this ulteriormente:

var myObject = { 
foo: "bar", 
func: function() { 
    var self = this; 
    console.log("outer func: this.foo = " + this.foo); 
    console.log("outer func: self.foo = " + self.foo); 
    (function() { 
     console.log("inner func: this.foo = " + this.foo); 
     console.log("inner func: self.foo = " + self.foo); 
    }()); 
    } 
}; 
myObject.func(); 

O/P

outer func: this.foo = bar 
outer func: self.foo = bar 
inner func: this.foo = undefined 
inner func: self.foo = bar 

Prima di ECMA 5 , this nella funzione interna fare riferimento all'oggetto della finestra globale; mentre, a partire da ECMA 5, this nella funzione interna sarebbe indefinito.

Problemi correlati