$.each()
没什么神奇的。这是一个简单的功能,它可以满足您的需求,也可以满足您的需求。如果没有,那么在代码示例中设置变量没有任何问题。编写自己的each()
函数完全符合您的需求并没有错。这只是几行代码,它会运行一个循环并调用您的回调函数。
下面是jQuery的1.10.1为$.each()
的源代码:
// args is for internal usage only
each: function(obj, callback, args) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike(obj);
if (args) {
if (isArray) {
for (; i < length; i++) {
value = callback.apply(obj[ i ], args);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.apply(obj[ i ], args);
if (value === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isArray) {
for (; i < length; i++) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
}
}
return obj;
},
此代码中的唯一的复杂性来自其处理对象和数组,有两种不同的情况为每个的事实。
为你处理的情况下,把它归结为:
for (; i < length; i++) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
只是有没有那么多的代码那里,如果你想要的东西没有做,你可以很容易地编写自己相似迭代器,它完全符合你的需求。
你甚至可以使用简单的for
循环。
function doExcitingStuff() {
var $elements = $("some-selector-logic");
for(var i = 0; i < $elements.length; i++) {
var $element = $($elements[i]);
if(someLogic($element))
return;
// Otherwise do stuff related to $element
}
someMoreExcitingCode(); // only runs if the loop completes
}
这一切都取决于什么让你的代码最干净。您可以使用$.each()
或编写自己的。
我还没有遇到任何其他方式来解决这个问题 –
为什么你需要知道?我从来没有亲自跑过这样的要求,乍一看它脱落为臭/泄漏。也许有更好的方法来解决你正在处理的更大的问题。 –
我想你已经拥有的是一个变体,但是我没有看到你已经拥有的优势 – TGH