2013-06-01 16 views
47

Każdy jest świadomy this w JavaScript, ale są też przypadki self spotykane w naturze, takie jak hereRóżnica między tym i ja w JavaScript

Więc jaka jest różnica między this i self w JavaScript?

+1

[A odnośnie tego] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) ... –

+6

@dystroy: Jest jeden: [ ' window.self'] (https://developer.mozilla.org/en-US/docs/Web/API/window.self) ('=== okno'). Chociaż OP prawdopodobnie oznacza banalną nazwę zmiennej ... – Bergi

+0

Och, ten jeden myślisz? Cóż ... może powinieneś wtedy odpowiedzieć. –

Odpowiedz

55

ile ustawiony w innym miejscu, wartość self jest window ponieważ JavaScript umożliwia dostęp do wszelkich nieruchomości x z window jako po prostu x zamiast window.x. Dlatego self jest naprawdę window.self, który różni się od this.

window.self === window; // true 

Jeśli używasz funkcji, która jest wykonywana w ramach globalnego i nie jest w trybie ścisłym, this domyślne do window, a zatem

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 

Jeśli używasz funkcji w inny kontekst, this będzie odnosił się do tego kontekstu, ale self nadal będzie window.

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

można znaleźć window.self zdefiniowane w W3C 2006 working draft for the Window Objecthere.

+9

Dla kompletności "self" jest przydatne w kontekście WebWorker, gdy okno nie jest dostępne (https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/ Using_web_workers). Użycie '' self'' zamiast '' window'' umożliwia dostęp do globalnego obiektu w przenośny sposób. – lqc

16

Chociaż jestem późno tutaj, ale natknąłem się na jeden z przykładów, które także mogą być pomocne w zrozumieniu this dalej:

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 

Przed ECMA 5 , this w funkcji wewnętrznej będzie odnosić się do globalnego obiektu okna; podczas gdy ECMA 5, this w funkcji wewnętrznej byłby niezdefiniowany.

Powiązane problemy