0

我有一种感觉,我错过了一些明显的东西。我正在从我的 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 工作正常并返回值,但其他控制台日志返回 undefined。我完全想念它。任何帮助,将不胜感激。

更新: 我已经将代码更改为:

    var privateTestVar = function () { return 'Test!'; }

var Public = {
    TestVar: privateTestVar
}

以及它的变体,但它会将这个确切的文本返回到控制台:“function () { return 'Test!'; }”

4

4 回答 4

3

Public此处分配的时间:

var Public = {
    init: init,
    TestVar: privateTestVar
}

privateTestVar仍然是未定义的(因为init()还没有运行)所以TestVar属性被初始化为 is 的privateTestVarundefined

TestVar属性被分配了 的值privateTestVar。如果它最初是未定义的(在这种情况下是),它将保持这种状态,直到您为TestVar属性分配不同的东西。我不会自动继承privateTestVar你所期望的未来值。Javascript 没有办法指定一个变量将始终包含分配给另一个变量的任何内容。 privateTestVar和 TestVar` 属性每个都有自己的值。将某些内容分配给一个变量不会影响另一个变量。

于 2013-05-31T02:05:00.663 回答
1

我建议将私有变量设为真正的私有变量,而改用 getter。这将正常工作:

var Public = {
    init: init,
    getVar: function() { return privateTestVar; }
}

MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.getVar());
于 2013-05-31T02:07:44.820 回答
0

问题如@jfriend00 所述。将代码更改为

var init = function () {
    if (privateTestVar == null ) {
        privateTestVar = "this is a test" ;
        Public.TestVar = privateTestVar;
        console.log( 'Init: ' + privateTestVar);
    }
};

我没有对此进行测试,但理论上它应该可以工作。

于 2013-05-31T02:11:31.190 回答
0

我认为这是您正在寻找的结构:

function PrivateFunc(private, public){
  this.privateVar = private;
  this.publicVar = public;
}
function PublicFun(public){
  this.publicVar = public;
  if(this.publicVar == null)this.publicVar = 'This is a public variable.';
  this.PrivateFun = function(private){
    return new PrivateFunc(private, this.publicVar);
  }
}

var pf = new PublicFun('public variable');
var pv = pf.PrivateFun('private variable');
console.log('pf.publicVar = '+pf.publicVar);
console.log('pf.privateVar = '+pf.privateVar);
console.log('pv.publicVar = '+pv.publicVar);
console.log('pv.privateVar = '+pv.privateVar);

注意PrivateFunc不是PrivateFun。真正的因素归结为关键词thisthis当您键入时指代当前对象thisvar只能在您的方法内部访问。您应该将JavaScript对象视为关联数组。如果这不适合您的需求,请尝试:

var jsObject = {
  publicVar: null,
  PrivateFun: function(private){
    var privateVar = private; //cannot access with dot
    return this;
  },
  PublicFun: function(public){
    this.publicVar = public;
    if(this.publicVar == null)this.publicVar = 'This is a public variable';
    return this;
  }
}

var pf = jsObject.PublicFun();
var pv = jsObject.PrivateFun('private variable');
console.log('pf.publicVar = '+pf.publicVar);
console.log('pf.privateVar = '+pf.privateVar);
console.log('pv.publicVar = '+pv.publicVar);
console.log('pv.privateVar = '+pv.privateVar+' //cannot access with dot');

请注意,对象文字不是构造函数,因此您不能创建new实例。此外,在 Object Literal 的情况下,var privateVar实际上是无用的,除非您不希望privateVar返回。this必须返回才能访问 jsObject,其中包含对publicVar.

于 2013-06-01T00:16:23.420 回答