2014-06-20 72 views
1

我正在使用require.js和backbone.js。我試圖設置一個變量,然後通過調用包含Require變量的模塊在整個應用程序的多個視圖中使用它。該模塊是:設置並獲取全局變量Require.js

define(function (require) { 
    "use strict"; 

    var variable_a = "aaa", variable_b ="bbb" ; 

    var some_variables = (function() { 

     return { 
      setVariableA: function (x) { 
       variable_a = x; 
      }, 
      return_a: variable_a, 
      return_b: variable_b 
     }; 

    })(); 

    return some_variables; 
}); 

在我看來,我包括模塊,然後設置變量,然後檢查已設置:

someVariables.setVariableA('456'); 
console.log('someVariables.return_a is '); 
console.log(someVariables.return_a); 

但這返回"aaa"而非"456"。我究竟做錯了什麼?使用

回答

0

的初始值這是一個非常常見的事實與JavaScript。當你分開範圍時,即寫如

(function(){ ... })() 

這個子範圍從父範圍獲取所有內容的副本。由於原始數據類型(例如string)在父作用域中,子作用域保存了原始數據的副本。因此,您在子作用域中所做的任何更改都不會反映在父作用域中。

解決方法是將原始數據更改爲object,以便孩子擁有參考。例如

define(function (require) { 
    "use strict"; 

    var variables = { 
    a : "aaa", 
    b : "bbb" 
}; 

var some_variables = (function() { 

    return { 
     setVariableA: function (x) { 
      variables.a = x; 
     }, 
     return_variables: variables 
    }; 

})(); 

return some_variables; 
}); 

和通話將改爲

some_variables.setVariableA('456'); 
console.log('someVariables.return_a is '); 
console.log(some_variables.return_variables.a); 

這會給你456如你預期。

+1

謝謝,這加入了「返回some_variables」後工作。到模式的底部。你可以添加,我會標記爲正確的? – Mark

+0

當然。我應該經過徹底的測試。 :) – Kamrul

0

return_a: function() { 
     return variable_a; 
}, 
return_b: function() { 
     return variable_b; 
} 

代替

return_a: variable_a, 
return_b: variable_b 

因爲當前 'return_a' 和 'return_b' 總是持有 'variable_a' 和 'variable_b'

+0

這沒有工作。當我這樣做時,console.log返回函數定義而不是變量 – Mark

+0

您是否嘗試調用該函數? – Dmitriy