Javascript:为私有变量分配私有方法

时间:2015-04-22 15:21:40

标签: javascript oop private javascript-namespaces

所以我遇到了一些JavaScript问题。我不是专业人士,也不明白为什么这不起作用。我所要做的就是将我的私有变量赋值给私有函数的返回值。如果我设置var xxx = function name(),它将在我引用xxx时执行该函数。这是我的代码。注 - var username = getsessionuser();下方。

//Namespace
var SESSIONCONTROLS=SESSIONCONTROLS || {};
SESSIONCONTROLS.APP=SESSIONCONTROLS.APP || {};


SESSIONCONTROLS.APP.User = (function () {
// defined within the local scope

//Private Variable
var username=getsessionuser();

//Privatemethod
var getsessionuser=function(){var mname='My Name'; return mname;}  

//Private Property & Method Example
var privateMethod1 = function () { alert("private method 1"); }
var privateMethod2 = function () { alert("private method 2");}

var privateProperty1 = 'foobar';
return {        
    //Public Method & Nested Namespace examples
    //Public Methods
    publicMethod1: privateMethod1,
    //nested namespace with public properties
    properties:{
        publicProperty1: privateProperty1,
        sessionname:username
    },
    //another nested namespace
    utils:{
        publicMethod2: privateMethod2
    }
  }
})();

这就是它在另一个例程中的称呼。

var name=SESSIONCONTROLS.APP.User.properties.sessionname;
alert(name);    

为什么这不起作用?

2 个答案:

答案 0 :(得分:4)

你有一个简单的订购问题:

var username=getsessionuser();

//Privatemethod
var getsessionuser=function(){var mname='My Name'; return mname;}  

JavaScript不会抱怨未定义的变量引用,因为它会将函数中的所有var语句视为在代码的最开头出现。但是,var语句中的初始化按照它们出现的顺序执行。

因此,在您的代码尝试初始化username时,未定义变量getsessionuser

如果您只是重新排序这两个语句以便首先定义该函数,那么该部分至少会起作用。

或者,您可以使用函数声明语句定义函数:

function getsessionuser() {
  var mname = "My Name";
  return mname;
}

那么即使你在函数之前保留username的初始化,你的代码也会工作,因为函数声明也会隐式地“挂起”到函数的开头。

答案 1 :(得分:1)

在定义之前调用getsessionuser()。移动

var getsessionuser=function(){var mname='My Name'; return mname;} 

上面

var username=getsessionuser();