簡體   English   中英

從函數訪問變量

[英]Access variables from functions

我是C#開發人員,正在嘗試在javascript中使用面向對象的編程。 對於以下代碼

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;
};

結果是一樣的。 因此問題仍然有效。 如何從函數操作私有變量?

您正在將本地var3暴露在返回的對象中,但從未將其設置為任何值。 您只能設置this.var3 您必須將var3 = b設置為返回值。

另外,如果您打算將它們設為私有,那么為什么要直接將它們公開? 您是否不想公開操縱對象私有狀態的函數( 因為您正嘗試面向對象 )?

而不是使用:

init3(a);

嘗試:

init3.call(this, a);

為什么? 當您使用init3(a)this被設置為全局對象( window在瀏覽器環境)。 call的功能的方法可以讓你設置this別的東西。 在這種情況下,我們只想傳播this值。

您的退貨單

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

正在暴露(設置為返回對象的屬性)變量的初始值(在init運行之前),這些變量的初始undefined 稍后,您可以通過設置this.var2 = a來覆蓋var2的公開值,並嘗試對var3做類似的事情,但是(如先前的回答所述)它不起作用,因為init3 this引用window 因此,對象屬性var1var3保持未定義狀態,只有var2更改。

如果這些變量是對象(包括init在內的數組和函數),則它們將通過引用而不是通過值進行傳遞,因此console.log("var1 " + t.var1); 等代表當前值,而不是初始值。

為了說明,請嘗試以下方法

np.Class1 = function () {
    var someVariables = {},
        self;

    var init = function(a) {
        self = this; // self now refers to the object from which init was called
        someVariables.var1 = a;
        this.var2 = a;
        init3(a);
    };

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

    return {
        init: init,
        vars: someVariables
    };
};

var t = new np.Class1();
t.init("t");
console.log("var1 " + t.vars.var1); // 't'
console.log("var2 " + t.var2); // 't'
console.log("var3 " + t.var3); // 't'
var newObj = {init: t.init}
newObj.init(true);
console.log(newObj); // Object {init: function, var2: true, var3: true}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM