1

快速提问,我对 JavaScript 还是很陌生,毫无疑问,我会从这个项目中学到很多东西。所以我提出一个问题(这很可能是一个愚蠢的问题),我的问题是:

我计划构建一个 Web 应用程序,该应用程序可以从 Raphael 或 Joint.js 动态生成形状,两者都非常相似,动态我的意思是在用户输入之前将有未定义数量的对象要绘制,例如数量他们希望绘制的对象 - 所以这里有一些代码来加强我的问题:

var erd = Joint.dia.erd;
Joint.paper("world", 800, 250);

var e1 = erd.Entity.create({
    rect: {
        x: 220,
        y: 70,
        width: 100,
        height: 60
    },
    label: "Entity"
});

所以,我创建了一个矩形类型的对象,但这是我想知道的 - 我可以这样做:

var erd = Joint.dia.erd;
Joint.paper("world", 800, 250);
int x, y;
for (int i = 0; i < numOfUserDefObjects; i++) {
    var e1 = erd.Entity.create({
        rect: {
            x: x,
            y: y,
            width: 100,
            height: 60
        },
        label: "Entity"
        x + 20;
        y - 40;
    });
}

一切都是让我困惑的是,var e1. 如果要创建 2 个对象,每当循环第二次遍历循环/创建第二个对象时,是否会从我的 SVG/Canvas 中擦除/删除/覆盖循环中创建的第一个对象?

对此有一点见解将不胜感激!同样,缺乏 JavaScript 经验,但这会改变。

再次感谢。

4

1 回答 1

2

在 javascript 中,用声明的局部变量var具有函数范围。这意味着每个函数只有一个该局部变量的副本。因此,在您的第二个代码块中,只有一个变量副本,e1并且for循环在每次迭代中为其分配不同的值。

您可以做您正在做的事情,但是e1当您完成时,其中只有一个值,并且该值将是for分配给它的循环的最后一次迭代。

我不确切知道您要完成什么,但是您可以像这样创建一个对象数组:

var erd = Joint.dia.erd;
Joint.paper("world", 800, 250);
var x = 0, y = 0;
var objs = [];
for (var i = 0; i < numOfUserDefObjects; i++) {
    objs.push(erd.Entity.create({
        rect: {
            x: x,
            y: y,
            width: 100,
            height: 60
        },
        label: "Entity"
    }));
    x += 20;
    y -= 40;
}
// objs now contains an array of the created objects

注意:我还初始化了 x 和 y,修复了要使用的声明,var并在循环int中正确地递增和递减 x 和 y 。for您发布的代码中有很多语法错误。

于 2013-02-07T15:22:37.050 回答