2012-04-12 5 views
4

ich versuche, meinen Code innerhalb einer sofortigen Funktion einzukapseln, die später über die globale Variable x zugegriffen wird und wie ein "Modul" fungiert.Wie man "das" innerhalb einer sofortigen Funktion benutzt

Code:

var x = (function() { 

    console.log(x); // undefined 
    console.log(this); // undefined 

})(); 

Aber ich verstehe nicht, warum ich this verwenden kann nicht selbst auf die Funktion zu verweisen.

EDIT:

die unmittelbare Funktion ist innerhalb einer anderen Funktion in Strict-Modus ("use strict")

Antwort

1

es ist eine lustige Sache, was geschieht, wenn eine Funktion innerhalb einer Funktion oder geben als Rückruf auf eine andere Funktion ausgeführt wird, die in strict mode

here's a demo, und beobachten Sie die Konsole

function foo(){ 
    'use strict'; 

    (function(){ 
     //undefined in strict mode 
     console.log('in foo, this is: '+this); 
    }()); 

} 

function bar(){ 

    (function(){ 
     //DOMWindow when NOT in strict mode 
     console.log('in bar, this is: '+this); 
    }()); 

} 

foo(); 
bar();​ 

so gehandhabt wird, Wenn dieser Code als Callback innerhalb einer anderen Funktion ausgeführt wird, die sich im strikten Modus befindet, verweist this nicht auf das globale window, sondern auf undefined.

+0

danke, weißt du, was der Grund für dieses seltsame Verhalten ist? –

+0

es wird in [diesem Abschnitt] (https://developer.mozilla.org/en/JavaScript/Strict_mode#.22Securing.22_JavaScript) des von mir bereitgestellten Artikels erklärt. Eine [ähnliche Antwort] (http://stackoverflow.com/a/1335881/575527) adressiert auch warum, hauptsächlich damit Code innerhalb von Funktionen keinen Zugriff auf das globale Objekt erhält. – Joseph

0

Sie nicht "dieses" beziehen sich auf die Funktion selbst verwenden können. "this" zeigt auf die Instanz eines Objekts innerhalb des Objekts.

0

this ist der Besitzer der Funktion. nicht die Funktion selbst.

und durch die Art und Weise, die Ausgabe, die Sie ist incorect berichtet:

console.log(this); // DOMWindow 

DEMO

Das ist, weil der Besitzer der immediate function das Global-Objekt ist - window.

Wie kommentiert, this muss nicht immer das DOMWindow Objekt sein, aber immer noch kann es nie undefined sein!

+0

nicht in allen Fällen, dass "dies" ist das "Fenster" – Joseph

+0

@Joseph. Das ist richtig, ** aber in allen Fällen nicht "undefiniert"! ** – gdoron

0

Eine selbstausführende Funktion (unmittelbare Funktion) liefert nur einen Ausführungskontext für die Zeit, in der sie ausgeführt wird. x wird immer undefiniert sein, weil es in deinem Code das Ergebnis der unmittelbaren Funktion zugewiesen bekommt und da es nichts zurückgibt, ist x undefiniert.

Dies sollte nicht undefiniert sein. In einer anonymen Funktion würde es sich auf das DOMWindow-Objekt beziehen. Das undefined, das Sie sehen, ist nur das Ergebnis der anonymen Funktion.

Wenn Sie ein „Modul“ oder Klasse Verhalten wollen, dann

nur
var x = function() { 
console.log(x, this); 
}; 

tun würde, wie es x Konstruktor machen würden Sie können dann das Objekt mit Eigenschaften, die Sie den Prototyp-Eigenschaft verwenden erben wollen verlängern.

x.prototype.foo = function() { 

} 
0

Sie sollten nicht this innen sofort Anon func verwenden, ist es sinnlos ist. this schlägt eine spätere Verwendung des erstellten Objekts vor, und unmittelbare Funktionen haben einen entgegengesetzten Zweck - den Namensbereich direkt nach der Ausführung zu zerstören. In Ihrem Beispiel soll this auf globales Objekt, Fenster verweisen.

Verwandte Themen