2016-12-16 8 views
-1

メソッドが別のメソッドを呼び出して、引数を渡さないように渡す最も良い方法は何ですか?Javascriptコンテキストを非表示にする

すなわち

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; 
} 

私はcontextのクローンを作成し、それを渡すことができ実現します。しかし、これを行う別の方法があるかどうか、おそらく匿名関数ラップを使用しているのだろうかと思っていましたか?

+0

なぜ '{x:true}'が生成されるのですか? – Li357

+0

@AndrewLi私は文脈が分かれると思ったので – Kousha

+1

しかし、あなたはオブジェクトを渡してそれを修正していますか?なぜそれは修正されないでしょうか? – Li357

答えて

0

さて、少し

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の名前を変更できるようにすることができます。

0

これは、技術的にxを再定義するのではなく、プロパティを追加するためです。

+0

私は、無名関数の全ポイントがコンテキストを分離することだと考えました。 – Kousha

+0

コンテキストを区切りたい場合は、サブオブジェクトを使用できます。 context = {x:{x:t​​rue}、y:{y:true}、次にcontext.xまたはcontext.yを実行します。 – Programah

0

あなたの疑問がどこから来たのか分かりませんでしたので、(私の知る限り)あなたのコードが行っていることの説明。

コードをhuman-englishに翻訳しようとします。

変数「context」を「グローバルスコープ」に定義します。 (どこからでも読むことができます)
定数であるため再定義できません。

その後、匿名の自己呼び出す関数を定義(これは、「開始」、それがグローバルスコープがアクセス権を持っていたすべてのものへのアクセス権を持っているので、グローバルスコープの上に新しい「ローカルスコープ」)

この自己呼び出す関数はパラメータxをつかみ、xtrueの値を持つプロパティyを追加し、contextの値を読む変数context

に自身を呼び出します。

お読みください:

関連する問題