JavaScript常量声明中嵌套函数的双括号语法困惑
关于立即执行函数表达式(IIFE)的括号疑问
我不理解以下常量内部嵌套函数示例中两组圆括号的作用:第一组包裹主函数,第二组在第5行单独存在:
const increment = (function () { return function increment (number, value) { return number + value; }; })(); console.log(increment(5,2)); // 输出7
移除这些括号不会报错,但会打印函数本身而非计算结果:
const increment = function () { return function increment (number, value) { return number + value; }; }; console.log(increment); // 输出:ƒ increment (number, value) { return number + value; }
我尝试使用单个普通函数(而非嵌套函数),正如预期不需要括号。最后,我曾猜测括号数量可能与嵌套函数的参数数量匹配,于是尝试了带三个参数的类似常量声明,结果发现所需括号与原示例一致:
const sum = (function () { return function sum1(a,b,c) { return a + b + c}; })(); console.log (sum(1,2,3)); // 输出6
不确定是遗漏了明显知识点还是不了解相关语法规则,希望能得到解答。
解答
这是JS里的立即执行函数表达式(IIFE,Immediately Invoked Function Expression),两组括号的作用分两部分:
- 第一组包裹外层函数的括号:把函数声明转换成函数表达式。JS语法规定,函数声明不能直接跟
()执行,比如直接写function () { ... }()会报错。用括号包裹后,原本的函数声明就变成了一个可以被执行的表达式,JS引擎能正确识别。 - 第二组单独的括号:用来立即调用这个外层函数表达式。外层函数执行后,会把内部定义的
increment(或sum1)函数返回出来,赋值给const声明的变量(increment或sum)。这时候变量存储的是内部的那个加法函数,调用increment(5,2)就是直接执行内部的加法逻辑。
如果去掉两组括号,increment变量存储的是外层的那个函数本身,而不是外层函数执行后返回的内部函数。这时候如果想得到计算结果,得先执行外层函数再调用内部函数,比如increment()(5,2)。
另外你测试的多参数例子里括号数量不变,是因为IIFE的括号只和外层函数的执行有关,和内部函数的参数数量完全无关——外层函数的作用只是返回内部函数,不管内部函数有几个参数,外层函数都只需要执行一次就能返回它。
内容的提问来源于stack exchange,提问作者lorenzo tamiazzo
相关产品推荐
相关产品推荐

