Javascript 涉及document.keydown()函数的未定义变量问题
问题出在这里,document.onkeydown=checkkeycode 我将两个变量传递给checkeycode e,它存储了事件和keycode,以及我想用变量c的最新位置更新的数组圆。当我将圆传递给函数时,它将变得未定义 {圆[4]=c.uuy}; 返回未定义的错误 我试着把文件放进去。写(圈); 在文档中,它只是写入了未定义的内容,当我用E切换它时,它变成了一个键盘对象。我需要解决的是:Javascript 涉及document.keydown()函数的未定义变量问题,javascript,function,variables,Javascript,Function,Variables,问题出在这里,document.onkeydown=checkkeycode 我将两个变量传递给checkeycode e,它存储了事件和keycode,以及我想用变量c的最新位置更新的数组圆。当我将圆传递给函数时,它将变得未定义 {圆[4]=c.uuy}; 返回未定义的错误 我试着把文件放进去。写(圈); 在文档中,它只是写入了未定义的内容,当我用E切换它时,它变成了一个键盘对象。我需要解决的是: 如何将数组圆传递给函数,以便当raphael转换圆时,它更新圆中的值 在if(keycode==
var paper=Raphael(50,50,420,300);
var d=纸张矩形(150、150、30、30);
var c=纸圈(50,50,40);
变量圆=[c.attrs.cy,c.attrs.cx,c.attrs.r,c.ux,c.y];
var rectie=[d.attrs.x,d.attrs.y,d.attrs.height,d.attrs.width];
document.onkeydown=checkKeycode
功能检查键代码(e,圆圈){
var键码;
如果(window.event)keycode=window.event.keycode;
如果(e)keycode=e,则为else;
如果(keycode==40){c.translate(0,10)};//{circle[4]=c.\uty};///down
if(keycode==39){c.translate(10,0)};//右
if(keycode==38){c.translate(0,-10)};//向上
if(keycode==37){c.translate(-10,0)};//左
}
//删除了我到目前为止的一些评论。
这里有几个问题:
1) 过场辩论
我将两个变量传递给checkeycode
不,你不是。浏览器将向它传递一个参数,即事件
(除非它是IE,但您已经处理过了)
如果您更改:
document.onkeydown = checkKeycode
到
…您将进入您在全局范围中定义的圆圈
2) 名字
您的checkkeycode
函数接受参数e
和circle
,但似乎使用e
和c
(您的checkkeycode
代码已经在全局范围内关闭了circle
,因此您可以从checkkeycode
的定义中删除circle
参数,并使用circle
而不是c
。但是,如果可以,最好将参数传递到functi中,以保持模块化)
因此,如果您要进行模块化并在事件处理程序中结束循环
:
var paper = Raphael(50, 50, 420, 300);
var d = paper.rect(150, 150, 30, 30);
var c = paper.circle(50, 50, 40);
var circle = [c.attrs.cy, c.attrs.cx, c.attrs.r, c._.tx, c._.ty];
var rectie = [ d.attrs.x, d.attrs.y, d.attrs.height, d.attrs.width];
document.onkeydown = function(e) {
return checkKeycode(e, circle); // Event handler is closure over `circle`
};
// v-- `c`, not `circle`
function checkKeycode(e, c) {
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
if (keycode == 40) { c.translate(0, 10)}; //{circle[4] = c._.ty};// down
if (keycode == 39) { c.translate(10, 0)}; // right
if (keycode == 38) { c.translate(0, -10)}; // up
if (keycode == 37) { c.translate(-10, 0)}; // left
}
只是说:脚本标记中的
language
-属性已被弃用。最好使用type=“text/javascript”
。谢谢。我实际上更改了函数,所以我没有将圆圈发送到函数中,只是将其作为全局变量进行访问,它正在工作。我没有料到这一点。我尝试先添加它,然后对其进行修改。不过我会尝试您的建议,非常感谢您的回答。这对我来说真的很重要。@user:没问题。原因是函数有权访问circle
的原因是它的定义范围与circle
的定义范围相同(在本例中为全局范围,但如果在另一个函数中定义函数,则为真)这里的术语是闭包;更多:@user:You是StackOverflow的新手,所以我要说的是:如果您觉得这个答案很有用,请单击旁边的向上箭头——这会给它投票。如果这个答案回答了问题(解决了问题等),请单击答案开头左侧的复选标记。这会将您的问题标记为“已回答”并认为这是正确的答案。
document.onkeydown = function(e) {
checkKeycode(e, circle);
};
var paper = Raphael(50, 50, 420, 300);
var d = paper.rect(150, 150, 30, 30);
var c = paper.circle(50, 50, 40);
var circle = [c.attrs.cy, c.attrs.cx, c.attrs.r, c._.tx, c._.ty];
var rectie = [ d.attrs.x, d.attrs.y, d.attrs.height, d.attrs.width];
document.onkeydown = function(e) {
return checkKeycode(e, circle); // Event handler is closure over `circle`
};
// v-- `c`, not `circle`
function checkKeycode(e, c) {
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
if (keycode == 40) { c.translate(0, 10)}; //{circle[4] = c._.ty};// down
if (keycode == 39) { c.translate(10, 0)}; // right
if (keycode == 38) { c.translate(0, -10)}; // up
if (keycode == 37) { c.translate(-10, 0)}; // left
}