这个AngularJS过滤器表达式是哪个javascript构造?

这个AngularJS过滤器表达式是哪个javascript构造?,javascript,angularjs,Javascript,Angularjs,如果我们希望在控制器端使用AngularJS中的过滤器,我们将使用 $filter('filter')(array, expression, comparator, anyPropertyKey) 我不明白这使用的是哪种javascript结构。我的意思是,它不是一个函数,它不是赋值表达式,它不是一个自动执行的函数。它是什么?它是一个函数,返回一个函数,然后执行该函数 function foo() { return function bar() {}; } foo()(); //

如果我们希望在控制器端使用AngularJS中的过滤器,我们将使用

$filter('filter')(array, expression, comparator, anyPropertyKey)

我不明白这使用的是哪种javascript结构。我的意思是,它不是一个函数,它不是赋值表达式,它不是一个自动执行的函数。它是什么?

它是一个函数,返回一个函数,然后执行该函数

function foo() {
    return function bar() {};
}

foo()();

// equivalent to:
var b = foo();
b();

它是一个函数,返回一个函数,然后执行

function foo() {
    return function bar() {};
}

foo()();

// equivalent to:
var b = foo();
b();

它是一个返回函数的函数。 以下是它的源代码:

function filterFilter() {
  return function(array, expression, comparator, anyPropertyKey) {
    if (!isArrayLike(array)) {
      if (array == null) {
        return array;
      } else {
        throw minErr('filter')('notarray', 'Expected array but received: {0}', array);
      }
    }

    anyPropertyKey = anyPropertyKey || '$';
    var expressionType = getTypeForFilter(expression);
    var predicateFn;
    var matchAgainstAnyProp;

    switch (expressionType) {
      case 'function':
        predicateFn = expression;
        break;
      case 'boolean':
      case 'null':
      case 'number':
      case 'string':
        matchAgainstAnyProp = true;
        //jshint -W086
      case 'object':
        //jshint +W086
        predicateFn = createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp);
        break;
      default:
        return array;
    }

    return Array.prototype.filter.call(array, predicateFn);
  };
}

它是一个返回函数的函数。 以下是它的源代码:

function filterFilter() {
  return function(array, expression, comparator, anyPropertyKey) {
    if (!isArrayLike(array)) {
      if (array == null) {
        return array;
      } else {
        throw minErr('filter')('notarray', 'Expected array but received: {0}', array);
      }
    }

    anyPropertyKey = anyPropertyKey || '$';
    var expressionType = getTypeForFilter(expression);
    var predicateFn;
    var matchAgainstAnyProp;

    switch (expressionType) {
      case 'function':
        predicateFn = expression;
        break;
      case 'boolean':
      case 'null':
      case 'number':
      case 'string':
        matchAgainstAnyProp = true;
        //jshint -W086
      case 'object':
        //jshint +W086
        predicateFn = createPredicateFn(expression, comparator, anyPropertyKey, matchAgainstAnyProp);
        break;
      default:
        return array;
    }

    return Array.prototype.filter.call(array, predicateFn);
  };
}