我在 JavaScript 函数中使用私有变量时遇到了一个小问题。这个软件依赖于draw2d,一个javascript的渲染库。该库迫使您使用 John Resig 的Class.js实现,它允许简单的 Java 类继承,我认为这是问题的根源。
//= require block/XBlock.js
console.log("sblock loaded.");
xmicro.block.SimpleBlock = xmicro.block.XBlock.extend({
NAME: "xmicro.block.SimpleBlock",
init: function(path, width, height,input,output,contextMenua){
this._super(path,width,height,input,output,contextMenua);
image = path;
this.contextMenu = contextMenua;
xmicro.istn.BlockAttributeStore[this.id] = new xmicro.block.BlockAttributeStore();
},
getImage: function () {
return this.image;
},
onContextMenu: function (x, y) {
supaId = this.id;
that = this;
var buildFunc = function(){
var args = Array.prototype.slice.call(arguments);
args.push(supaId);
return that.contextMenu.build.apply(null, args);
};
if(this.contextMenu !== undefined){
$.contextMenu({
trigger: "right",
selector: this.contextMenu.selector,
build: buildFunc
});
}
},
getPersistentAttributes: function () {
var memento = this._super();
return memento;
}
});
顶部的注释做了一些自动连接,但问题的焦点在于onContextMenu
函数。我有一个需要调用的闭包,以便从属性对象构建 jQuery 上下文菜单。该属性对象中的一件事是一个名为 的方法build
,我用它buildFunc
来拦截调用并附加调用它的图形的 id。
问题是,如果我声明var supaId = this.id
,当我制作更多这种类型的数字时,它们就会开始共享 supaId,并开始交叉污染变量。另一个问题是,如果我supaId = this.id
像下面这样使用,那么它可以工作,但会将 supaId 放在全局范围内。这些都不是我的好选择,我想了解如何解决它。
任何帮助表示赞赏!