2014-06-20 76 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