我遇到以下情况:
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个循环/回收循环吗?
答案 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"});