簡體   English   中英

JS函數調用鏈中的上下文丟失

[英]Losing context in JS function call chain

我有一些用於復雜事物的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的實例)的Primitive類的調用也可以工作,但是上下文被弄亂了。 我希望我可以在“ isHidden”函數中訪問諸如attributeModel之類的實例變量,但是它們不再存在。 同樣,“ self”不是實例,而是其他實例(看起來像全局的“ document”或“ window”實例),但是“ this”將轉換為實例……在聲明對象時我做錯了什么嗎? 我不明白為什么第一個對象的調用有效,但是子對象已連接...

問題似乎已解決...

我正在使用Visual Studio進行調試。 編寫了AttributeWrapper中“ isHidden”函數的“ return false”以放置一個斷點,並繼續編寫該函數的代碼(以在調試器中查看對象及其字段)。 遇到斷點時,我遇到了描述問題。

今天,我與一位同事一起探討了這個問題,他的想法是可能只是調試器在某種程度上造成了混淆,並且沒有顯示正確的狀態。 因此,我完成了代碼並再次開始調試。 當斷點被擊中時,狀態突然是正確的。 因此,似乎真正的問題是調試器混亂,並且一切正常。 通過在函數中使用上下文中的某些內容,似乎可以解決此困惑。

獲得的經驗:Visual Studio可能不是調試javascript的最佳選擇=)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM