从函数中访问变量

时间:2013-02-09 23:03:31

标签: javascript

我是C#开发人员,他试图在javascripts中使用面向对象的编程。对于以下代码

var np =  np || {};

 np.Class1 = function () {

    var var1,
        var2,
        var3;

    var init = function(a) {
        var1 = a;
        this.var2 = a;
        init3(a);
    };

    var init3 = function(b) {
        this.var3 = b;
    };

    return {
        init: init,
        var1: var1,
        var2: var2,
        var3: var3
    };
};

var t = new np.Class1();
t.init("t");
console.log("var1 " + t.var1);
console.log("var2 " + t.var2);
console.log("var3 " + t.var3);

我得到了:

 var1 undefined 
 var2 t 
 var3 undefined 

我可以在Class1中获取私有变量的唯一方法是使用this.var2 = a;,但它不适用于从其他函数调用的函数。如何从函数init3()访问私有变量?

被修改

即使我像这样更改功能init3()

var init3 = function(b) {
  var3 = b;
};

结果是一样的。所以问题仍然有效。如何操作函数中的私有变量?

3 个答案:

答案 0 :(得分:0)

您在返回的对象中暴露了本地var3,但您从未将其设置为任何内容;你只设置了this.var3。您必须设置var3 = b才能返回值。

此外,如果您的意图是私人,为什么要直接公开它们?你宁愿暴露那些操纵对象私有状态的函数(since you're trying to be object-oriented)吗?

答案 1 :(得分:0)

而不是使用:

init3(a);

尝试:

init3.call(this, a);

为什么呢?使用init3(a)时,this设置为全局对象(浏览器环境中为window)。 call函数方法可让您将this设置为其他内容。在这种情况下,我们只想传播this值。

答案 2 :(得分:0)

您的退货声明

return {
        init: init,
        var1: var1,
        var2: var2,
        var3: var3
    };

正在公开(设置为返回对象的属性)变量的初始值(在init运行之前),undefined。您稍后通过设置var2来覆盖this.var2 = a的公开值,并尝试为var3执行类似操作,但是(如前面的答案中所述)它不起作用,因为{{1 } this中的{}指的是init3。因此,对象属性windowvar1仍然未定义,只有var3更改。

如果这些变量是对象(包括数组和函数,如var2那样),它们将通过引用而不是值传递,因此init等的输出将代表当前值,而不是初始值。

例如,try this

console.log("var1 " + t.var1);