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.
Warum würde es '{x: true}' produzieren? – Li357
@AndrewLi Weil ich dachte, der Kontext wäre getrennt – Kousha
Aber Sie sind ein Objekt übergeben und ändern? Warum sollte es * nicht * modifiziert werden? – Li357