2016-12-16 1 views
-1

Was ist der beste Weg für eine Methode, eine andere Methode aufzurufen und die Argumente nicht-by-Referenz-Mode übergeben?Javascript den Kontext verbergen

heißt

function main() { 
    let context = {}; 
    // Pass context to someOtherFunction 
    // Such that console.log(context) in this function does not show `{whatever: true}` 
} 

function someOtherFunc(context) { 
    context.whatever = true; 
} 

Ich weiß, ich kann die context klonen und dass passieren. Aber ich habe mich gefragt, ob es eine andere Möglichkeit gibt, das zu tun, vielleicht mit anonymen Funktionswrap?

+0

Warum würde es '{x: true}' produzieren? – Li357

+0

@AndrewLi Weil ich dachte, der Kontext wäre getrennt – Kousha

+1

Aber Sie sind ein Objekt übergeben und ändern? Warum sollte es * nicht * modifiziert werden? – Li357

Antwort

0

Okay, lassen Sie uns dies brechen ein bisschen

const context = {x: true}; 

Oben erstellen Sie ein Objekt (namens Kontext) im globalen Bereich.

function(x) { 
    "use strict"; 
    x.y = true; 
} 

Sie erstellen eine anonyme Funktion, die einen Verweis auf ein Objekt übernimmt, und fügt eine neue Eigenschaft y auf das Objekt

(/*...*/)(context); 

Sie die obige Funktion in eine IIFE gewickelt, so führt er sofort. Für den Parameter haben Sie einen Verweis auf das globale Objekt context bereitgestellt, auf das innerhalb des IIFE von x verwiesen wird.

Objekte werden als Referenz übergeben.Das Übergeben von context an die Funktion erstellt kein neues Objekt x, das eine Kopie der context ist, es erstellt eine neue Referenz x, die auf dasselbe Objekt verweist, das context verweist.

Wenn Sie das bereitgestellte Objekt tatsächlich in ein neues Objekt kopieren müssen, müssen Sie dies selbst tun. Wie oben erwähnt, besteht ein Mechanismus darin, das Objekt in JSON zu stringulieren und dann das JSON wieder zu einem neuen Objekt zu analysieren. Es gibt andere, abhängig davon, was Sie erreichen müssen.

Dies ist nicht einmal eine Scope- oder Kontextfrage überhaupt - es gibt einen Verweis auf ein Objekt in einer Funktion weiter. Selbst wenn Ihr IIFE auf keinen Fall direkt auf die -Variable zugreifen konnte, sobald Sie einen Verweis auf dieses Objekt als Eingabe an die Funktion übergeben haben, hat die Funktion die Referenz und kann tun, was sie möchte.

Sie scheinen auch falsch zu verstehen, wie IIFEs Daten verbergen. Sie verstecken Dinge innerhalb der IIFE von Sachen außerhalb, nicht umgekehrt. Selbst dann wird es Sie nicht davon abhalten, eine Referenz außerhalb des IIFE zu passieren. Hier ein Beispiel:

function changeName(animal) { 
    "use strict" 
    //myDog.name = "Rex"; // Error - myDog isn't a valid reference in this scope 
    //myCat.name = "Rex"; // Error - myCat isn't a valid reference in this scope either 
    animal.name = "Rex"; // Perfectly legal 
} 

(function() { 
    var myDog = {name: "Rover"}; 
    var myCat = {name: "Kitty"}; 

    console.log(myDog); 
    console.log(myCat); 
    changeName(myDog); // Even though changeName couldn't directly access myDog, if we give it a reference, it can do what it likes with it. 
    console.log(myDog); 
})() 

In diesem Fall hat changeName keinen Zugang zu myDog oder myCat rein enthalten sind, innerhalb des Verschlusses durch die IIFE gebildet. Der in diesem IIFE vorhandene Code kann jedoch einen Verweis auf myDog an changeName übergeben und ihm ermöglichen, den Namen des Hundes zu ändern, auch wenn changeName mit der myDog-Variablen immer noch nicht auf das Objekt zugreifen konnte.

0

Dies liegt daran, dass Sie x technisch nicht neu definieren, sondern Eigenschaften hinzufügen.

+0

Ich dachte, der ganze Punkt der anonymen Funktionen wäre, den Kontext zu trennen. – Kousha

+0

Nun, wenn Sie Kontext trennen möchten, könnten Sie Unterobjekte, z. context = {x: {x: true}, y: {y: true} und dann context.x oder context.y – Programah

0

Ich habe nicht wirklich verstanden, wo Ihre Zweifel kamen, so ist dies (nach meinem besten Wissen) eine Erklärung, was Ihr Code tut.

Ich werde versuchen, den Code in Human-Englisch zu übersetzen.

Definieren Sie die Variable context im "globalen Bereich". (Es kann von überall gelesen werden)
Es kann nicht neu definiert werden, weil es eine Konstante ist.

Danach eine anonyme Selbst Aufruf Funktion (die „beginnt“ ein neuer „lokaler Bereich“ über dem globalen Bereich, so dass es Zugriff auf alles hat die globale Reichweite Zugang zu hatte) definieren

Diese Selbst Aufrufen Funktion greift Parameter x und fügt die Eigenschaft y mit einem Wert von bis truex und nennt sich mit der variablen context

den Wert context lesen.

Bitte lesen: