【问题标题】:JavaScript Object is set but is null when accessedJavaScript 对象已设置但访问时为空
【发布时间】:2015-06-18 11:33:02
【问题描述】:

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

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) 函数中的 console.log(this._content) 表明变量已正确设置。但是,当我希望通过浏览器控制台或其他代码行通过this.getLocal()item._content 访问会话对象的内容时,我得到未定义的返回给我。

所以为了更清楚地说明这个过程,这是我在会话中已经有数据的重新加载时所做的:

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

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

这不会打印任何东西。

除非item.set 函数特别设置,否则我是否无法访问该项目的内容?

【问题讨论】:

  • 您正在创建sessionObject 的实例吗?并且不需要this._content; 声明
  • 更新了问题以显示我如何使用该对象。

标签: javascript c#


【解决方案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);

【讨论】:

  • 完美。谢谢@Patrick,我的困惑源于$.get 请求中对this 的引用,我认为只需使用变量作为参考就可以解决这个问题。这是一次有趣的学习经历。
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多