js switch case 语句中 事件重复调用

for(var i; i < 10; i++){
    switch(type(i)){
        case 'import':
            $(id[i]).bind(function);
            break;
        case 'save':
            $(id[i]).bind(function);
            break;
           ···
        default:
           break;
    }
}

这么一个for + swtch ,然后执行代码后 发现每个相应id上绑定了 n多click事件。 求各位大神解释。

阅读 3.8k
3 个回答

这种情况我一般会这么写

function onImport() { }
function onSave() { }

const actions = {
    // 如果有参数自己扩展
    "import": () => onImport(),
    "save": () => onSave()
};

for (let i = 0; i < 10; i++) {
    const handler = actions[type(i)];
    if (handler) {
        $(id[i]).bind(handler);
    }
}

至于你的问题,这个代码不能复现,我怀疑是在别的地方调用了多次绑事件的处理。

  1. 首先,这个问题应该不是javascript语言的特性问题,属于程序逻辑的问题。
  2. 其次,你的代码,有错误,在for里面var i应该还要给i初始化赋值,也即for(var i=0;i<10;i++)
  3. 然后,我模拟了你的代码,没有重现你的问题,是不是你的type(i)取到的值都是一样的?这是我模拟的代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>TEST</title>
    <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="> crossorigin="anonymous"></script>
</head>
<body>
    <button id="btn0">btn0</button>
    <button id="btn1">btn1</button>
    <button id="btn2">btn2</button>
    <script type="text/javascript">
    for (var i = 0; i < 3; i++) {
        switch (i) {
            case 0:
                $('#btn' + i).bind('click', function(event) {
                    console.log($(this).text());
                });

                break;
            case 1:
                $('#btn' + i).bind('click', function(event) {
                    console.log($(this).text());
                });
                break;
            case 2:
                $('#btn' + i).bind('click', function(event) {
                    console.log($(this).text());
                });
                break;
            default:
                break;
        }
    }
    </script>
</body>
</html>

i 没有声明初始值的情况下是 undefined,undefined < 10 是 false,所以这个循环其实根本就没进去。因此题主可以看下是不是其他地方绑定造成。

假设题主是写错了,其实是 var i = 0 的话,目前对我们来说有两个黑盒,一个是 type 函数内部如何运作,一个是 id 这个 map 长什么样子,不过 type 无论是什么理论上在 id[i] 是不同值的情况下,也不会让每个 id 绑上 n 个,因此最有可能的还是 id 这个 map 是什么样子的,建议题主去看下这个 id 的 map 是不是有问题,是不是无论传任何 i 都返回同样的结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题