我有种感觉我错过了一些明显的东西。我从javascript模块返回一个变量,但它始终未定义。
下面是模块:
var MyNs = MyNs || {};
MyNs.Global = function () {
var privateTestVar;
var init = function () {
if (privateTestVar == null ) {
privateTestVar = "this is a test" ;
console.log( 'Init: ' + privateTestVar);
}
};
var Public = {
init: init,
TestVar: privateTestVar
}
return Public;
} ();
这里有个电话:
MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.TestVar);
init函数中的console.log工作正常并返回值,但另一个控制台日志返回未定义的值。我完全错过了。任何帮助都将不胜感激。
更新:--我已经对代码做了一些修改,如下所示:
var privateTestVar = function () { return 'Test!'; }
var Public = {
TestVar: privateTestVar
}
以及它的变体,但是它会将这个确切的文本返回到控制台:"function () {返回'Test!';}“
发布于 2013-05-30 18:05:00
在这里分配Public
时:
var Public = {
init: init,
TestVar: privateTestVar
}
privateTestVar
仍未定义(因为init()
尚未运行),因此TestVar
属性被初始化为privateTestVar
的值,即undefined
。
TestVar
属性被分配为privateTestVar
的值。如果它最初是未定义的(在本例中是这样的),它将保持这种状态,直到您将一些不同的东西分配给TestVar
属性。我不会自动继承privateTestVar
的未来值,这也许正是您所期望的。Javascript没有一种方法来指定一个变量总是包含分配给另一个变量的任何内容。privateTestVar
和TestVar`各有各自的值。将某项分配给一个变量不影响另一个变量。
发布于 2013-05-30 18:07:44
我建议使用getter来使私有变量真正成为私有变量。这将正确地工作:
var Public = {
init: init,
getVar: function() { return privateTestVar; }
}
MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.getVar());
发布于 2013-05-30 18:11:31
问题如@jfriend00所述。将代码更改为
var init = function () {
if (privateTestVar == null ) {
privateTestVar = "this is a test" ;
Public.TestVar = privateTestVar;
console.log( 'Init: ' + privateTestVar);
}
};
我没有测试这个,但理论上应该有效。
https://stackoverflow.com/questions/16848692
复制相似问题