JavaScript对象已设置,但在访问时为null

时间:2015-06-18 03:21:24

标签: javascript c#

我有以下构造会话变量的对象:

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()功能设置会话时,_content设置正确且可通过item.getLocal()公开访问(在浏览器控制台中或在码)。

当我重新访问页面并且已经创建了引用所述项目的会话对象时,当我运行item.get()函数时,它访问会话变量并将其设置为_content对象,我知道这个因为我可以在console.log(this._content)函数中执行setLocal(),这表明变量已正确设置。但是,当我希望通过浏览器控制台或代码的其他行通过this.getLocal()item._content访问会话对象的内容时,我将返回给我。

因此,为了说明这个过程,我在重新加载时会做的事情是会话中已有数据:

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

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

这不会打印任何内容。

除非item.set功能专门设置,否则我无法访问此项目的内容?

1 个答案:

答案 0 :(得分:1)

因为你这样做:

var setterCallback = this.setLocal;

并称之为:

setterCallback(data);

您丢失了sessionObject实例的上下文,因此setLocal函数中的this不再是您的对象实例,而是全局window对象。

您可以做两件事来纠正这个问题,保存对this的引用,而不是保存对该函数的引用,并从该引用调用setLocal

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

或保存setLocal引用时可以bind对象实例

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