在jQuery' filter()`中使用非匿名函数

时间:2016-05-24 13:20:55

标签: jquery filter refactoring

我在filter()中使用了jQuerys for loop,并且出于性能原因,我想重构我的代码以不使用匿名函数。

我现在有什么:

function filterSegments() {
  var myVar = 5;
  for (var i=0; i < segments; i++) {

    clone.children().filter(function(i) {
      return i < myVar;
    ).remove();
  }
}

我想要的是什么:

function filterSegments() {
  var myVar = 5;
  for (var i=0; i < segments; i++) {

    clone.children().filter(myFunc).remove();
  }
}

function myFunc(i, elem, myVar) {
  return i < myVar;
}

我的问题是,这比一次又一次地使用匿名函数更有效率吗?第二个问题,如何将myFunc()变量传递给myVar,而不必将其声明为全局变量

我想同样的概念可能适用于jQuery&#39; each()

1 个答案:

答案 0 :(得分:0)

你会获得相同的表现;但如果你真的想要,你可以做其他一些事情。

设置一个closure,其函数返回.filter可以使用的函数:

function filterSegments() {
  var myVar = 5;
  for (var i = 0; i < segments; i++) {
    clone.children().filter(myFunc(myVar)).remove();
  }

  function myFunc(max) {
    return function(i) { return i < max; };
  }
}

如果您想使用.bind,它将如下所示:

function filterSegments() {
  var myVar = 5;
  for (var i = 0; i < segments; i++) {
    clone.children().filter(myFunc.bind(null, myVar)).remove();
  }

  function myFunc(max, i) {
    return i < max;
  }
}

如果您想使用ES6 Arrow Functions

function filterSegments() {
  var myVar = 5;
  for (var i = 0; i < segments; i++) {
    clone.children().filter(j => j < myVar).remove();
  }
}

这是我的最爱,因为它使阅读变得如此简单,非常简洁!

编辑:

我差点忘了!您可以使用jQuery&#39; .remove([selector])种类:

function filterSegments() {
  var myVar = 5;
  for (var i = 0; i < segments; i++) {
    clone.children().remove(':lt(' + myVar + ')');
  }
}

甚至更好(所以你不要经历所有孩子)使用.children([selector])种类:

function filterSegments() {
  var myVar = 5;
  for (var i = 0; i < segments; i++) {
    clone.children(':lt(' + myVar + ')').remove();
  }
}