在JS函数调用链中丢失上下文

时间:2016-02-16 16:15:20

标签: javascript javascript-objects

我有一些JS"对象"我正在使用一些复杂的东西。因此,以下代码被简化为所需的最小信息:

function AttributeWrapper(model) {
    var self = this;
    var attributeModel = model;

    self.labelPrimitive = null;
    self.mandatorySignPrimitive = null;
    self.documentationPrimitive = null;
    self.valuePrimitive = null;

    self.isHidden = function() {
        return false;
    }
}

function Primitive(model, wrapper) {
    var self = this;
    var groupingObject = wrapper;

    self.model = model;
    self.layoutCell = null;

    self.render = function() {

        if (self.isHidden()) {
            return;
        }

        self.layoutCell.getDomElement().innerHTML = self.model.id || "TODO";
    }

    self.isHidden = function() {
        return groupingObject.isHidden();
    }
}

这个对象主要用于:

function AnOtherObject {
    var self = this;

    self.anyFunction = function() {
        var wrapper = new AttributeWrapper(model);
        var primitive = new Primitive(anOtherKindOfModel, wrapper);

        var isHidden = primitive.isHidden();
    }
}

出于任何原因,第一次通话正常。所以在Primitive" class"中的功能调用并且范围正确(变量按预期设置)。此外,Primitive类对其包含的对象(AttributeWrapper的实例)的调用也起作用,但是上下文混乱了。我希望我可以在" isHidden"中访问像attributeModel这样的实例变量。功能,但他们不再存在。也是"自我"不是实例,而是其他东西(看起来像全球"文档"或"窗口"实例),但是"这个"逆转到实例...... 在对象的声明中有什么我做错了吗?我不明白为什么第一个对象的调用有效,但是子对象是有线的......

1 个答案:

答案 0 :(得分:0)

问题似乎已经解决了......

我正在使用visual studio进行调试。 "返回false" " isHidden"编写AttributeWrapper中的函数是为了放置断点并继续写入此函数的代码(以查看调试器中的对象及其字段)。当断点被击中时,我遇到了描述问题。

今天我和一位同事一起看了一下,他的想法是,调试器可能会以某种方式混淆并且没有显示正确的状态。 所以我完成了代码并再次开始调试。突然,当断点被击中时,状态是正确的。 所以似乎问题真的是一个混乱的调试器和everthing工作正常。通过使用函数中的上下文中的某些东西,这种混乱似乎得到了解决......

经验教训:视觉工作室可能不是调试javascript =)的最佳选择。