JavaScript函数中的相邻圆括号是如何工作的,这在哪里有记录

How do adjacent parentheses in JavaScript functions work, and where is this documented?

本文关键字:工作 在哪里 记录 何工作 函数 圆括号 JavaScript      更新时间:2023-09-26

在将其标记为重复之前,请注意:我理解IIFE是什么。这个问题与IIFE无关。

问题是:为什么JavaScript能够解析相邻的括号,即使在标准函数调用中也是如此?这个构造myFunction()()-是如何工作的?例如,这里有一段使用Jasmine进行测试的代码:

var element = compile('<div my-directive></div>')(scope);

为什么我们要走这条路,而不是把范围作为第二个论点?我不认为这和保持全球环境清洁有任何关系,我在任何地方都找不到关于这个特殊结构的任何东西,除非它涉及IIFE。这个构造有名字吗?

最重要的是,请提供某种权威参考(链接到mdn、ecmascript规范等)。

这是两个规则的结果:

  1. 函数调用的返回值可以立即使用(无需分配给变量)。

  2. 函数是对象(它们可以被分配给变量,作为参数传递,并从函数调用中返回)。

第一条规则意味着,如果你有这样的代码:

function a () { return { hello : 'world' } }

你可以这样做:

a().hello; // returns 'world';

这与在不使用任何临时变量的情况下进行此操作基本相同:

var tmp = a();
tmp.hello; // value is 'world';

第二条规则意味着你可以这样做:

function b () { return function () { alert('hello world') } }
var c = b();
c(); // alerts 'hello world';

组合规则1和规则2意味着以上内容可以重写为:

b()(); // alerts 'hello world';

这一切都与闭包有关。实际情况是compile()必须返回一个接受变量的函数,在本例中为scope

让我们看一个更简单的例子:

function adder (first) {
  return function (second) {
    return first + second;
  };
};
adder(2)(3);
// returns 5
var add2 = adder(2);
// add2 now equals function (second) { return 2 + second; }
add2(4);
// returns 6

通常,这样做的一个原因是,您希望以多种方式重用一个函数。在compile的情况下,您可以运行compile一次,并将其与许多不同的对象(或作用域)一起重用。此外,你可以用它做一些变化。

即,上面的例子可以是adder3adder4等。

编译可能有这样的行为:

function compile(html) {
  // Some code here to turn string template into something more useable
  return function (scope) {
    // Scope being an object with values to plug into a template
    return DOM_element;
  }
}

compile('<div my-directive></div>')必须返回具有scope参数的函数。

也许它看起来像这样:

function compile(stringArg){
  return function(scopeArg){
    if(typeof scopeArg === 'object'){
      console.log(stringArg);
    }
  }
}