感叹号在函数之前有什么作用?

2022-08-29 22:01:14
!function () {}();

答案 1

JavaScript 语法 101:下面是一个函数声明

function foo() {}

请注意,没有分号;这只是一个函数声明。您需要一个调用 ,才能实际运行该函数。foo()

现在,当我们添加看似无害的感叹号时:它把它变成了一个表达式。它现在是一个函数表达式!function foo() {}

当然,单独调用函数不会调用函数,但我们现在可以在末尾放置:,它比函数具有更高的优先级,并立即调用该函数。!()!function foo() {}()!

function foo() {}()这将是一个语法错误,因为你不能把参数()放在函数声明之后。()

因此,作者正在做的是为每个函数表达式保存一个字节;一种更具可读性的编写方式是这样的:

(function(){})();

最后,使表达式根据函数的返回值返回布尔值。通常,立即调用的函数表达式(IIFE)不会显式返回任何内容,因此其返回值将为 ,这给我们留下了 哪个是 。不使用此布尔值。!undefined!undefinedtrue


答案 2

功能:

function () {}

不返回任何内容(或未定义)。

有时,我们希望在创建函数时将其调用。你可能会想试试这个:

function () {}()

但它会导致 .SyntaxError

在函数之前使用运算符会导致它被视为表达式,因此我们可以调用它:!

!function () {}()

这也将返回与函数的返回值相反的布尔值,在本例中为 ,因为是 。如果您希望实际的返回值是调用的结果,请尝试按以下方式操作:true!undefinedtrue

(function () {})()