为什么我的for-loop只提示我输入一次?

时间:2017-12-01 23:33:27

标签: javascript for-loop switch-statement event-listener

我希望用户能够单击向上箭头5次,并且每次记录单独的startTime和endTime。因此,控制台将返回它们响应的速度(msResponse)。

for (var i = 0; i < 5; i++) {
        var startTime = new Date().getTime();
        document.addEventListener("keydown", function touch(e) {
            switch (e.keyCode) {
                case 38: 
                    var endTime = new Date().getTime();
                    var msResponse = endTime - startTime;
                    console.log(msResponse);
                    document.removeEventListener("keydown", touch);
                    break;
            }
        })};

我期待循环会提示我5次点击向上箭头。每次设置一个新的startTime和endTime。

但是,第一次单击向上箭头时,它会循环5次,每次循环迭代时,msResponse会略微增加。

如果有人能帮助我更好地理解这一点,那就太棒了!

非常感谢!

1 个答案:

答案 0 :(得分:0)

For循环用于重复和创建新变量。因为除了重复代码之外不使用for循环,它最终看起来像这样:

var startTime = new Date().getTime();
    document.addEventListener("keydown", function touch(e) {
        switch (e.keyCode) {
            case 38: 
                var endTime = new Date().getTime();
                var msResponse = endTime - startTime;
                console.log(msResponse);
                document.removeEventListener("keydown", touch);
                break;
        }
    })};

/*Main problem you mentioned in your question was that time is only increasing ever so slightly. You are reassigning startTime = new Date() in your second iteration.*/


var startTime = new Date().getTime();
    document.addEventListener("keydown", function touch(e) {
        switch (e.keyCode) {
            case 38:
                var endTime = new Date().getTime();
                var msResponse = endTime - startTime;
                console.log(msResponse);
                document.removeEventListener("keydown", touch);
                break;
        }
    })};

每按一次键,我都会创建一个记录时间数组,并在数组达到时取消绑定键。长度为x。

var startTime = new Date().getTime();
var endTime = [startTime];


window.addEventListener( "keydown", function touch(e) {
  if(endTime[5] !== undefined){
    window.removeEventListener( 'keydown', touch() );
  }else if ( e.keyCode === 38 ){
    var msResponses = new Date().getTime();
    endTime.push(msResponses);
  }
});

此代码根据时间创建一个数字数组,您可以从开头减去它们以获取自调用函数以来的时间,或者从相互之间减去它们以获得第一次按下和第二次按下,第二次和第三次之间的差异。或者其他什么。