【问题标题】:Javascript Variable not passing through ocanvas function and for loopJavascript变量不通过ocanvas函数和for循环
【发布时间】:2015-05-16 01:31:18
【问题描述】:

我遇到了一个变量没有通过 ocanvas 函数传递的问题。似乎变量在函数内部发生了变化,但没有在函数外部发生变化。这是我的代码:

                sonicSpeed2 = 0;
                sonicState2 = 0;

                canvas.bind("keypress", function () {
                    var keys = canvas.keyboard.getKeysDown();
                    var x;

                    sonicSpeed2 = 4;

                    for (x = keys.length; x > 0; x--) {
                        if (keys[x-1] == 16 && keys.length > 1) {
                            sonicSpeed2 = 15;
                            sonicState2 = 2;
                        }
                        if (keys[x-1] == 65) {
                            sonicState2 = 1;
                            sonicDirection2a = false;
                        }
                        if (keys[x-1] == 68) {
                            sonicState2 = 1;
                            sonicDirection2a = true;
                        }
                        if (keys[x-1] == 87) {
                            sonicState2 = 1;
                            sonicDirection2b = false;
                        }
                        if (keys[x-1] == 83) {
                            sonicState2 = 1;
                            sonicDirection2b = true;
                        }
                    }
                });

                if (sonicDirection2a == false) {
                    nullObject2.x -= sonicSpeed2;
                }
                else if (sonicDirection2a == true) {
                    nullObject2.x += sonicSpeed2;
                }

                if (sonicDirection2b == false) {
                    nullObject2.y -= sonicSpeed2;
                }
                else if (sonicDirection2b == true) {
                    nullObject2.y += sonicSpeed2;
                }

【问题讨论】:

    标签: javascript scope ocanvas


    【解决方案1】:

    事件处理程序在未来一个不确定的时间执行。 绑定事件处理程序,这就是您对canvas.bind("keypress", ...) 所做的事情,不会执行该函数。 之后会立即执行。

    如果你想对事件做出响应,它必须在事件处理程序中或从事件处理程序中执行。

    参考Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

    【讨论】:

    • 感谢您的回答,我通过放置 sonicSpeed2 = 0;声波状态2 = 0;在运动代码之后。我相信我现在明白它的工作原理了,键盘输入功能将在循环中最后呈现,对吗?
    • 不确定你的意思。我的观点是,事件处理程序之后的if 语句在事件处理程序执行之前执行。 IE。 nullObject2.x -= sonicSpeed2; 永远不会看到新值(我认为这是您想要的)。您还必须将这些 if 语句放入处理程序中。
    猜你喜欢
    • 2015-05-21
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多