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

Javascript JS函数调用链中的上下文丢失,javascript,javascript-objects,Javascript,Javascript Objects,我有一些JS“对象”,我用它来做一些复杂的东西。因此,以下代码被简化为所需的最少信息: function AttributeWrapper(model) { var self = this; var attributeModel = model; self.labelPrimitive = null; self.mandatorySignPrimitive = null; self.documentationPrimitive = null; s

我有一些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();
    }
}
不管出于什么原因,第一次呼叫都可以正常工作。因此,调用了原语“类”中的函数,并且范围正确(变量按预期设置)。原语类对其包含的对象(AttributeWrapper的实例)的调用也起作用,但是在那里上下文被弄乱了。我希望我可以在“isHidden”函数中访问像attributeModel这样的实例变量,但它们已经不存在了。另外,“self”不是实例,而是其他东西(看起来像全局“文档”或“窗口”实例),但“this”与实例相反。。。
我在申报物品时有没有做错什么?我不明白为什么第一个对象的调用是有效的,但子对象是连接的…

问题似乎已经解决了

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

今天我和一位同事一起看了一下,他认为可能只是调试器有点混乱,没有显示正确的状态。 因此,我完成了代码并再次开始调试。当断点被命中时,状态突然变为正确。 因此,问题似乎真的是一个混乱的调试器,一切都正常工作。通过在函数中使用上下文中的某些内容,这种混淆似乎得以解决


经验教训:visual studio可能不是调试javascript的最佳选择()

问题似乎已经解决了

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

今天我和一位同事一起看了一下,他认为可能只是调试器有点混乱,没有显示正确的状态。 因此,我完成了代码并再次开始调试。当断点被命中时,状态突然变为正确。 因此,问题似乎真的是一个混乱的调试器,一切都正常工作。通过在函数中使用上下文中的某些内容,这种混淆似乎得以解决


经验教训:visual studio可能不是调试javascript=)的最佳选择。

代码中有许多
self
s。哪个
self
恰好成为
窗口
?另外,它如何被称为“第一次”以及如何被称为“第二次”?在原语实例的“isHidden”调用期间,AttributeWrapper实例的“self”并不十分清楚您试图实现什么。您已经声明了一个自变量来保存“this”的引用,但是在上面的代码中,“this”永远不会脱离上下文。请记住,在函数A中,您可以访问父作用域中的变量。如果函数B在函数A内,则不在函数A内。因此,您将在函数a内部创建一个变量来引用外部范围,以便函数B具有访问权限。您可以将上下文作为参数传递到函数中,也可以使用function.call或function.apply显式设置“this”的上下文。查看它,您的“primitive”函数将无法确定自身是“this”,因为它没有显式声明。您最好明确说明self-var是模态对象。我对您的代码进行了快速测试,结果很好。失败的情况是什么?代码中有许多
self
s。哪个
self
恰好成为
窗口
?另外,它如何被称为“第一次”以及如何被称为“第二次”?在原语实例的“isHidden”调用期间,AttributeWrapper实例的“self”并不十分清楚您试图实现什么。您已经声明了一个自变量来保存“this”的引用,但是在上面的代码中,“this”永远不会脱离上下文。请记住,在函数A中,您可以访问父作用域中的变量。如果函数B在函数A内,则不在函数A内。因此,您将在函数a内部创建一个变量来引用外部范围,以便函数B具有访问权限。您可以将上下文作为参数传递到函数中,也可以使用function.call或function.apply显式设置“this”的上下文。查看它,您的“primitive”函数将无法确定自身是“this”,因为它没有显式声明。您最好明确说明self-var是模态对象。我对您的代码进行了快速测试,结果很好。失败的情况是什么?