Ist das möglich und wenn ja wie? (Ich habe keinen Weg gefunden, wie es funktioniert)

var foo = function() 
{ 
    console.log("Original Function");
    this = function() 
    {
        console.log("New Function");
    }
};
console.log("Calling foo()");
foo();

Gewünschte Ausgabe:

Ursprüngliche Funktion

Aufruf von foo ()

Neue Funktion

Um die Fragen im Voraus zu beantworten: Ja, ich weiß, dass es andere Möglichkeiten gibt, dies zu tun. Ich bin nur neugierig, ob ich so etwas wie var bar = new foo(); machen und foo() einige zeitabhängige Eigenschaften ohne zusätzliche Funktion zuweisen könnte.

BEARBEITEN: Antwort auf die Charmanders-Frage und eine etwas weniger vereinfachte, praktischere Anwendung

var node = function(parent)
{
    this = function()
    {
        for (i in this)
        {
            // perform actions (which will occasionally include calling i()
        }
    }
    if (parent !== null)
    {
        this.parent = parent;
        // code to determine children
        this.somechild = new node(this);
        this.someotherchild = new node(this);
    }
};
var ancestor = new node(new node(null));
0
FatalKeystroke 6 Okt. 2012 im 23:43

3 Antworten

Beste Antwort

Das Zuweisen eines neuen Werts zu this funktioniert nicht, aber Sie können einfach eine Funktion zurückgeben:

var foo = function() { 
    console.log("Original Function");
    return function() {
        console.log("New Function");
    };
};

console.log("Calling foo()");
var f = foo(); /* or even: f = new foo(); */
f();
2
Niko 6 Okt. 2012 im 19:48

Ja, aber Sie tun dies nicht, indem Sie this zuweisen:

function foo() {
  console.log("original");
  foo = function() {
    console.log("new");
  };
}

Sie weisen dem globalen Symbol "foo" lediglich einen neuen Wert zu, sodass der neue Wert zufällig eine Funktion ist.

Wenn Sie also foo() zweimal aufrufen, wird beim ersten Mal "Original" und danach jedes Mal "Neu" gedruckt.

Der Wert von this ist normalerweise nicht der Wert der Funktion, auf die verwiesen wird. es kann sein sein, aber Sie müssten eine etwas ungewöhnliche Situation einrichten. Selbst wenn dies der Fall wäre, können Sie this keinen neuen Wert zuweisen.

0
Pointy 6 Okt. 2012 im 19:45

Wenn Sie diese Technik verwenden möchten, müssen Sie der äußeren Funktionsvariablen direkt zuweisen:

var foo = function() 
{ 
    console.log("Original Function");
    foo = function() 
    {
        console.log("New Function");
    };
};

Wenn die Funktion nicht wissen sollte, wo sie gespeichert ist, damit mehrere unabhängige Kopien der Funktion vorhanden sein können, möchten Sie wirklich eine Closure Factory verwenden:

function makeReplacingFunction() {
    var fn;

    fn = function() {
        console.log("Original Function");
        fn = function() {
            console.log("New Function");
        };
    };

    return function() { fn(); }
}

var foo = makeReplacingFunction();
foo();
foo();
2
cdhowie 6 Okt. 2012 im 19:48