回收循环?

时间:2016-01-18 14:09:09

标签: javascript for-loop

我遇到以下情况:

var count = something.length;

google.maps.event.addDomListener( div, 'click', function( event ) {
   for( a = 0; a < count; a++ ) {
     // action 1
   }
});
google.maps.event.addDomListener( div, 'mouseover', function( event ) {
   for( a = 0; a < count; a++ ) {
     // action 2 
   } 
});

google.maps.event.addDomListener( div, 'mouseout', function( event ) {
   for( a = 0; a < count; a++ ) {
     // action 3
   }
});

我有几个这样的情况,我似乎总共有太多的循环。

如您所见,所有循环都循环遍历相同的数组,但操作不同

我能解决类似情况,只有1个循环/回收循环吗?

4 个答案:

答案 0 :(得分:3)

不确定你的意思&#34;回收&#34;循环,但看起来像一个更好的代码。通过将所有循环组合在一起,我看不到任何可以获得的东西

var count = something.length;
function loopFunc(action){
   for( a = 0; a < count; a++ ) {
        action();
   }
}
function addMapLoopEvent(eventName,action){
   google.maps.event.addDomListener( div, eventName, function( event ) {
        loopFunc(action)
    });
}

addMapLoopEvent('click', action1));
addMapLoopEvent('mouseover', action2));
addMapLoopEvent('mouseout', action3));    

答案 1 :(得分:2)

如果循环发生在或多或少的同时,将它们组合起来只会是有效的:

for (a=1;a<10;a++) {
   // action a
}
for (b=1;b<10;b++) {
   // action b
}

变为:

for (a=1;a<10;a++) {
   // action a
   // action b
}

这不是这种情况。您有三个互斥的不同事件。只要行动非常不同 - 意味着没有多少重复的代码 - 组合它们没有任何好处。事实上,就可读性而言,它可能是 dis 的优势。

问题的进一步复杂化在于,与jQuery的on方法不同,vanilla JS can't pass more than one event type at a time to addDomListener.所以你必须编写一个自定义循环来分割事件字符串,然后{{} 3}}运行适当的循环,进一步使代码复杂化而没有明显的好处。

答案 2 :(得分:1)

您可以这样做:

var count = something.length;

function customCallback(callback) {
    for( var a = 0; a < count; a++ ) {
        if(typeof callback == 'function') {
            callback();
        }

        console.log(count + ' => ' + a)
    }
}

function someAction(msg) {
    console.log(msg);
}

google.maps.event.addDomListener( div, 'click', function( event ) {
    customCallback(); // will output your console.log from customCallback function
});

google.maps.event.addDomListener( div, 'mouseover', function( event ) {
    customCallback(someAction); // will output your console.log from someAction function (undefined) and customCallback function console.log
    customCallback(someAction('hi')); // will output your console.log from someAction function ("hi") and customCallback function console.log
});

google.maps.event.addDomListener( div, 'mouseout', function( event ) {
    customCallback(function(event) {
        console.log('Do something awesome.');
        event.preventDefault();
    }); // will output your console.log from someAction function (undefined) and customCallback function console.log
});

答案 3 :(得分:0)

将它放在一个函数中,并通过调用传递给函数的变量函数来重用它。

如果您使用的是jQuery,可以通过在两者之间添加空格来添加多个事件,例如:'click mouseover mouseout'

routes.MapRoute(
       "UselessConfigOption",
       "config/options",
       new { controller = "MyCtrl", action = "MyAction"});