在 javascript 中立即调用函数表达式

Immediately Invoked Function Expression in javascript

javascript 中立即调用的函数表达式在末尾放置 ( ) 的原因是什么

(function() {
    // Code that runs in your function
})( /* this parenthesis in the end */ )

一个立即调用的函数表达式是一个:

(function() { ... })函数表达式立即调用()

详细来说,(function() { ... })只是定义函数,定义但从未调用的函数绝对没有做任何事情。

函数中的代码要执行,需要调用(通常称为调用函数).这就是为什么你将函数定义包裹在括号中(使其成为一个计算结果为函数引用的表达式)然后 立即调用 (或调用)带有任何参数的函数 () - 或者没有你的样本中的参数。

这或多或少相当于这样做:

const someFunc = (function() { ... }); //merely assigns a function, the code inside doesn't run
someFunc(); //invokes the function (but in this case it isn't immediate)

除非在这种情况下您将函数引用绑定到一个变量,因此它不再是 IIFE。

原因纯粹是语法上的。 JavaScript 解析器必须能够轻松区分函数声明和函数表达式。如果我们省略函数表达式两边的括号,并把我们的立即数 作为单独的语句调用 function(){}(3),JavaScript 解析器将开始处理它并结束,因为它是一个以键开头的单独语句- word function,它正在处理一个函数声明。

因为每个函数声明都必须有一个名字(这里我们没有指定),所以会抛出错误。为了避免这种情况,我们将函数表达式放在括号内,向 JavaScript 解析器发出信号,表明它正在处理一个表达式,而不是一个语句。还有一种实现相同目标的替代方法:

  (function(){}(3))

通过将直接函数定义和调用包裹在括号内,您还可以通知 JavaScript 解析器它正在处理一个表达式。

这四个表达式是在各种 JavaScript 库中常见的立即调用函数表达式的同一主题的变体:

+function(){}();
-function(){}();
!function(){}();
~function(){}();

这一次,我们可以使用一元运算符:+、-、! , 和 ~.我们这样做是为了向 JavaScript 引擎发出信号,表明它正在处理表达式而不是语句。