在为HTML 5游戏(使用画布)创建骨架时,我注意到一个关于JavaScript语言的有趣怪癖,我似乎并不太明白!
具体来说,我创建了一个对象(节点)数组,我可以毫无问题地通过函数(" node"),但即使确认在控制台日志中识别出所述对象,{ {1}}方法似乎无法将所述对象识别为数组中的项(给我通用" -1"输出)。
.indexOf()

function StartGame(){
//Initiating draw variables
cx = document.getElementById("GameMap")
seeds = cx.getContext("2d")
//Resetting nodes
nodes = []
GenNodes() //randomly generates and scatters new connector nodes on the game-map
}
function GenNodes() {
for (i=0; i<10; i++) {
nodes[i]= new SeedNode()
}
}
function SeedNode() {
this.shape = "circle"
this.radius = "10"
this.x = 730*Math.random() + 10
this.y = 730*Math.random() + 10
DrawNode(this,this.x,this.y)
}
function DrawNode(node,x_cen,y_cen) {
console.log(node)
console.log(nodes.indexOf(node))
seeds.beginPath();
seeds.arc(x_cen,y_cen,10,0,2*Math.PI);
seeds.stroke();
seeds.fillText(nodes.indexOf(node),x_cen,y_cen)
}
&#13;
我的(相当简单的)猜测是对象在某种程度上不是这种基于数组的方法的有效输入。如果是这种情况,是否有符合W3C标准的方法来解决这个问题?
答案 0 :(得分:3)
您尝试在将节点添加到nodes
之前打印索引。你将永远得到-1。简而言之,请将DrawNode
移出SeedNode
。
function GenNodes() {
for (var i=0; i<10; i++) {
var node = new SeedNode()
nodes.push(node)
DrawNode(node,node.x,node.y)
}
}
function SeedNode() {
var node = {}
node.shape = "circle"
node.radius = "10"
node.x = 730*Math.random() + 10
node.y = 730*Math.random() + 10
return node
}
答案 1 :(得分:2)
没有经过测试,但他的问题似乎在于这三个功能
function GenNodes() {
// Rest of code
nodes[i]= new SeedNode()
}
function SeedNode() {
//Rest of code
DrawNode(this,this.x,this.y)
}
function DrawNode(node,x_cen,y_cen) {
// Rest of code
console.log(nodes.indexOf(node))
seeds.fillText(nodes.indexOf(node),x_cen,y_cen)
}
在函数GenNodes
中,您尝试填充nodes
数组但这取决于从SeedNode
函数返回。同样,此SeenNode
依赖于DrawNode
函数的返回。这意味着一次DrawNode
&amp; SeedNode
已执行,然后将元素放入nodes
数组中。但在放置元素之前,您正在检查indexOf
nodes
内DrawNode
数组中的元素{{1}}。
所以它返回-1,我认为根据indexOf
上的文档,这是正确的答案 2 :(得分:2)
你有一个范围问题。永远不会在nodes
找到它的任何地方声明DrawNode()
。要解决此问题,请在任何函数之外声明nodes
:
var testMe = [];
function doSomething() {
doTheThing();
}
function doTheThing() {
testMe[0] = "hi";
testMe[1] = "there";
doTheOtherThing();
}
function doTheOtherThing() {
console.log("This works");
console.log(testMe.indexOf("there"));
}
doSomething();