2016-11-26 20 views
0

グローバル変数は悪い習慣とみなされますが、単純な「シングルトン」値の一種として使用したいと思います。node.js:匿名関数からグローバル変数を設定する方法は?

以下に、NodeJSのグローバルスコープで変数を宣言するための3つの異なる方法があります(私は思っています)。関数change2()は値を "... one"から "... two"に変更するのに成功します。しかし、function change3()は "... three"に設定されていません。

グローバル変数の値を匿名関数から変更するにはどうすればよいですか?私はまた、効果のないセッターメソッドを呼び出すことも試みました。 bind()呼び出しは無力な推測です。

global.v1 = 'v1: one'; 
    var v2 = 'v2: one'; 
    v3 = 'v3: one'; 

    function change2() { 
     global.v1 = 'v1: two'; 
     v2 = 'v2: two'; 
     v3 = 'v3: two'; 
    }; 

    function change3() { 
     (function() { 
      global.v1 = 'v1: three'; 
      v2 = 'v2: three'; 
      v3 = 'v3: three'; 
     }).bind({v1:v1, v2:v2, v3:v3}); 
    }; 

    console.log (v1, v2, v3); 
    change2(); 
    console.log (v1, v2, v3); 
    change3(); 
    console.log (v1, v2, v3); 

出力は次のようになります。change3()

O:\node>node scope 
v1: one v2: one v3: one 
v1: two v2: two v3: two 
v1: two v2: two v3: two 

O:\node> 
+1

「module.exports = {}」という内容のファイル "v1.js"は、単純シングルトンの方がうまく機能します。あなたの他のモジュールで単純な 'require( './ v1')'を実行します。 –

+0

'change3()'では、内部関数を決して実際に実行することはありません。 '.bind()'は新しい関数を返すだけですが、実際に呼び出すことはありません。 – jfriend00

+0

スポッティングのための@ jfriend00ありがとうございました。 '.bind(...)'を単に '()'に置き換えると、呼び出しが開始され、 "... three"が設定されます。 –

答えて

1

あなたが実際に内部関数を実行することはありません。 .bind()は単に新しい関数を返しますが、実際にはその新しい関数を呼び出すことはありません。

あなたはそれを呼び出すようにしたい場合は、あなたが.bind()後に括弧を追加する必要があると思います:

function change3() { 
    (function() { 
     global.v1 = 'v1: three'; 
     v2 = 'v2: three'; 
     v3 = 'v3: three'; 
    }).bind({v1:v1, v2:v2, v3:v3})(); // add parens at the end here 
}; 

しかし、それはあなたを助けていないとしてあなたもここに.bind()は必要ありません。

function change3() { 
    (function() { 
     global.v1 = 'v1: three'; 
     v2 = 'v2: three'; 
     v3 = 'v3: three'; 
    })(); // add parens at the end here 
}; 
関連する問題