设置了JavaScript对象,但在访问时为null - javascript

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

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对象,我知道这一点,因为我可以执行<cc console.log(this._content)函数中的>,表明已正确设置了变量。但是,当我希望通过浏览器控制台或其他代码行通过setLocal()this.getLocal()访问会话对象的内容时,我会得到未定义的信息。

因此,为了进一步说明该过程,这是我在重新加载时执行的操作,该重新加载中会话中已有数据:

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

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

这不会打印任何内容。

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

参考方案

因为您这样做:

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

javascript popupwindow之后的行如何工作? - javascript

好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

Javascript-Urls的奇怪字符串比较行为 - javascript

最近,在编写我无法理解的javascript时遇到了字符串比较的问题。我从完全相同的网址创建了两个字符串,当我比较它们时返回false,但是在重新分配相同的字符串后,比较返回true。这是我的示例:var str1 = "http://google.com/"; var str2 = "http://google.com‏/&#…

Javascript-从当前网址中删除查询字符串 - javascript

单击提交按钮后,我需要从网址中删除查询字符串值。我可以用jQuery做到这一点吗?当前网址:siteUrl/page.php?key=value 页面提交后:siteUrl/page.php 实际上,我已经从另一个带有查询字符串的页面着陆到当前页面。我需要在页面首次加载时查询字符串值以预填充一些详细信息。但是,一旦我提交了表格,我就需要删除查询字符串值。我已…

Javascript IF语句 - javascript

                        嗨,我有这段代码可以正常工作,并将两个日历显示为一个日历。我还有一个php变量$login_session,其中包含登录电子邮件地址的用户。关于如何显示[email protected]日历的任何想法(伪代码)IF $login_session == "[email protected]&#…

如何根据手势滚动网页 - javascript

如何使用pyhton / javascript使用手势向上/向下或向左/向右滚动页面。我尝试了很多找到解决方案,但无法解决。 参考方案 Javascript手势插件(JSHG)是一个很棒的插件,它使您可以通过现有网站或Web应用程序中的网络摄像头来支持用户的手势识别。您无需具有计算机视觉的任何背景即可使用此插件。当前,它提供了一组基本的手势,其中包括手的位置…