![](/img/trans.png)
[英]How do I avoid nodejs vm script function call losing context when called function is itself in the context?
[英]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.