感叹号在函数之前有什么作用?
2022-08-29 22:01:14
!function () {}();
JavaScript 语法 101:下面是一个函数声明:
function foo() {}
请注意,没有分号;这只是一个函数声明。您需要一个调用 ,才能实际运行该函数。foo()
现在,当我们添加看似无害的感叹号时:它把它变成了一个表达式。它现在是一个函数表达式。!function foo() {}
当然,单独调用函数不会调用函数,但我们现在可以在末尾放置:,它比函数具有更高的优先级,并立即调用该函数。!
()
!function foo() {}()
!
function foo() {}()
这将是一个语法错误,因为你不能把参数()放在函数声明之后。()
因此,作者正在做的是为每个函数表达式保存一个字节;一种更具可读性的编写方式是这样的:
(function(){})();
最后,使表达式根据函数的返回值返回布尔值。通常,立即调用的函数表达式(IIFE)不会显式返回任何内容,因此其返回值将为 ,这给我们留下了 哪个是 。不使用此布尔值。!
undefined
!undefined
true
功能:
function () {}
不返回任何内容(或未定义)。
有时,我们希望在创建函数时将其调用。你可能会想试试这个:
function () {}()
但它会导致 .SyntaxError
在函数之前使用运算符会导致它被视为表达式,因此我们可以调用它:!
!function () {}()
这也将返回与函数的返回值相反的布尔值,在本例中为 ,因为是 。如果您希望实际的返回值是调用的结果,请尝试按以下方式操作:true
!undefined
true
(function () {})()