2016-11-26 108 views
0

全局變量被認爲是不好的做法,但我想用它們作爲一種簡單的「單例」值。node.js:如何在匿名函數中設置全局變量?

以下包含三種不同的方法來在NodeJS中聲明全局範圍內的變量(我認爲)。函數change2()成功地將它們的值從「... one」更改爲「... two」。然而函數change3()並沒有將它們設置爲「... three」。

如何從一個匿名函數中更改全局變量的值? - 我也嘗試調用setter方法,但沒有任何效果。 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); 

輸出爲:

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

不是直接的答案,但文件「v1.js」的內容爲'module.exports = {}'對於一個簡單的單例更好。然後在你的其他模塊中簡單的require('./ v1')'。 –

+0

在'change3()'中你永遠不會執行內部函數。 '.bind()'只是返回一個新的函數,但你永遠不會真正調用它。 – jfriend00

+0

謝謝@ jfriend00發現。用'()'代替'.bind(...)'觸發了調用,設置了「... 3」。 –

回答

1

change3()你從來沒有真正執行的內部功能。 .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 
}; 
相關問題