さて、少し
const context = {x: true};
これを打破しましょう
上記では、グローバルスコープ内にオブジェクト(名前付きコンテキスト)を作成します。
function(x) {
"use strict";
x.y = true;
}
あなたはそれをすぐに実行してあなたが生命維持に上記の機能を包ん
(/*...*/)(context);
をオブジェクトへの参照を取る無名関数を作成し、そのオブジェクトに新しいプロパティy
を追加します。このパラメータには、グローバルcontext
オブジェクトへの参照が渡されました。このオブジェクトは、IIFE内部のx
によって参照されます。
オブジェクトは参照渡しされます。context
を関数に渡すと、context
のコピーである新しいオブジェクトx
は作成されず、context
と同じオブジェクトを参照する新しい参照x
が作成されます。
実際に提供されたオブジェクトを新しいオブジェクトにコピーする必要がある場合は、それを自分で行う必要があります。前述のように、1つのメカニズムはオブジェクトをJSONにストリング化し、次にJSONを解析して新しいオブジェクトに戻すことです。あなたが達成する必要があるものに応じて他にもあります。
これはスコープやコンテキストに関する質問でもありません。オブジェクトへの参照を関数に渡しています。たとえあなたのIIFEが変数context
に直接アクセスする方法がなかったとしても、そのオブジェクトへの参照を関数への入力として渡すと、その関数は参照を持ち、それが好きなことをすることができます。
また、IIFEがデータをどのように隠すかについて誤解されているようです。あなたは物事を隠す物事からはの外に、その逆はありません。それでも、あなたがIIFE外の参照を渡すのを妨げることはありません。ここに例を示します。この場合
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);
})()
、changeName
は純粋生命維持することによって形成されたクロージャ内に含まれるmyDog
又はmyCat
へのアクセスを有していません。しかし、changeNameが変数myDog
を使用してオブジェクトにアクセスすることができなかったにもかかわらず、そのIIFE内に存在するコードはchangeNameにmyDogへの参照を渡し、dogNameの名前を変更できるようにすることができます。
出典
2016-12-16 23:53:28
PMV
なぜ '{x:true}'が生成されるのですか? – Li357
@AndrewLi私は文脈が分かれると思ったので – Kousha
しかし、あなたはオブジェクトを渡してそれを修正していますか?なぜそれは修正されないでしょうか? – Li357