簡體   English   中英

設置了JavaScript對象,但在訪問時為null

[英]JavaScript Object is set but is null when accessed

我有以下構造會話變量的對象:

var sessionObject = function (key) {
    this._key = key;
    this._content;
    this.set = function (v) {
        this.setLocal(v);
        $.post('/Program/SetVariable',
        { key: this._key, value: v }, function (data) {
        });
    };
    this.get = function (callback) {
        var setterCallback = this.setLocal;
        $.get('/Program/GetVariable',
        { key: this._key }, function (data) {
            setterCallback(data);
        }).done(function () {
            callback();
        });
    };
    this.setLocal = function (v) {
        this._content = v;
    };
    this.getLocal = function () {
        return this._content;
    };
}

我在控制器中的C#如下:

public ActionResult SetVariable(string key, string value)
{
    Session[key] = value;
    return this.Json(new { success = true });
}

public ActionResult GetVariable(string key)
{
    return this.Json(Session[key], JsonRequestBehavior.AllowGet);
}

每當頁面加載時,我都會創建一個新的會話對象,該對象引用服務器上會話中的項目。 使用set()函數set()會話后, _content設置正確,並且可以通過item.getLocal() (在瀏覽器控制台或代碼中)公開訪問。

當我重新訪問該頁面並且已經創建了引用該項目的會話對象時,當我運行item.get()函數時,它將訪問該會話變量並將其設置為_content對象,我知道這一點,因為我可以做一個console.log(this._content) setLocal()函數中的console.log(this._content) ,表明變量已正確設置。 但是,當我希望通過瀏覽器控制台或其他代碼行通過item._content this.getLocal()item._content訪問會話對象的內容時,我會得到未定義的信息。

因此,為了進一步說明該過程,這是我在重新加載時執行的操作,其中會話中已有數據:

var item = new sessionObject("item");
item.get(printData);

function printData() {
   $("printbox").append(item.getLocal());
}

這不會打印任何內容。

除非是由item.set函數專門設置的,否則我無法訪問此項目的內容嗎?

因為您這樣做:

var setterCallback = this.setLocal;

並這樣稱呼它:

setterCallback(data);

您丟失了sessionObject實例的上下文,因此setLocal函數中的this不再是您的對象實例,而是全局window對象。

你可以做兩兩件事來解決這個問題,保存到一個參考this ,而不是保存到函數的引用,並從引用調用SETLOCAL

var that = this;
/.../
that.setLocal(data);

或者您可以在保存setLocal引用時綁定對象實例

var setterCallack = this.setLocal.bind(this);

暫無
暫無

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

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