该函数从内部调用自身的作用是什么?

时间:2020-04-08 02:36:41

标签: javascript

下面给出的功能是基于多个条件的JS排序功能。我在某些网站上发现了这个很酷的功能。如果有人可以向我解释此功能,那就太好了。

我无法理解它的最后一部分,在其中用给定一个&b变量的另一个括号来调用它本身。 sortbyMultipleKeys(keys.slice(1))(a,b)

以这种方式调用函数;对我来说是全新的f()(a,b)<-Howwwwwwwwwww ??? :|。

如果有人可以举例说明,我将不胜感激。 :)

var obj = [
  {alpha: 'c',year: 2002},
  {alpha: 'b',year: 2004},
  {alpha: 'a',year: 2004},
  {alpha: 'd',year: 2003},
  {alpha: 'a',year: 2002},
  {alpha: 'c',year: 2004},
  {alpha: 'd',year: 2001},
  {alpha: 'b',year: 2002},
  {alpha: 'a',year: 2003},
  {alpha: 'b',year: 2002},
  {alpha: 'd',year: 2001},
  {alpha: 'c',year: 2004}
];

function sortbyMultipleKeys(keys) {
  return function(a, b) {
    if (keys.length == 0) return;
    key = keys[0];
    if (a[key] > b[key]) return 1;
    else if (a[key] < b[key]) return -1;
    else return sortbyMultipleKeys(keys.slice(1))(a, b);
  }
}

let a = obj.sort(sortbyMultipleKeys(["alpha", "year"]));

console.log(a)

2 个答案:

答案 0 :(得分:3)

关于Javascript的特殊之处在于,您可以从函数中返回函数

function foo(){
  return function() { console.log('Hello!'); }
}

console.log(foo()); //prints function bar () { console.log('Hello') }

foo()(); //prints Hello!

所以sortbyMultipleKeys(keys.slice(1))(a, b)本质上是在调用从sortbyMultipleKeys函数返回的函数。

function sortbyMultipleKeys(keys) {
  return function(a, b) { //notice how this function is being returned
    if (keys.length == ...
  }
}

如果您不了解sortbyMultipleKeys的工作原理,建议阅读有关“闭包”的文章。

例如,当您这样做

console.log(sortbyMultipleKeys(["alpha", "year"]))

,您会看到已打印功能。

/* prints: ƒ (a, b) {
    if (keys.length == 0) return;
    key = keys[0];
    if (a[key] > b[key]) return 1;
    else if (a[key] < b[key]) return -1;
    else return sortbyMultipleKeys(keys.slice(1))(a, b);
  } */

请注意,keys变量存在于函数中,即使只能在sortbyMultipleKeys范围内访问。但这要归功于闭包。它可能是此代码中最重要的部分。希望能有所帮助:)

答案 1 :(得分:0)

这是一个功能:

hi = (s) => "hi from " + s

这让我们定义:

() => hi('a')

当我们这样做时会发生什么?

(() => hi('a'))()

或者这个:

(() => hi)()('a')

它们都输出相同的东西吗?功能只是一回事。 JavaScript使您可以返回内容。方法调用运算符()调用函数。它使您可以检索其中的内容。