提问人:Sebastian Otto 提问时间:9/21/2010 最后编辑:E_net4Sebastian Otto 更新时间:3/15/2023 访问量:234740
感叹号在函数之前有什么作用?
What does the exclamation mark do before the function?
答:
它返回语句的计算结果是否为 false。例如:
!false // true
!true // false
!isValid() // is not valid
您可以使用它两次将值强制转换为布尔值:
!!1 // true
!!0 // false
因此,为了更直接地回答您的问题:
var myVar = !function(){ return false; }(); // myVar contains true
编辑:它具有将函数声明更改为函数表达式的副作用。例如,以下代码无效,因为它被解释为缺少所需标识符(或函数名称)的函数声明:
function () { return false; }(); // syntax error
评论
var myVar = !function(){ return false; }()
!
var myVar = function(){ return false; }()
true
!0
false
!1
功能:
function () {}
不返回任何内容(或未定义)。
有时,我们希望在创建函数时立即调用函数。您可能很想尝试以下方法:
function () {}()
但它会导致 .SyntaxError
在函数之前使用运算符会导致它被视为表达式,因此我们可以调用它:!
!function () {}()
这也将返回与函数返回值相反的布尔值,在本例中,因为 是 。如果您希望实际返回值是调用的结果,请尝试这样做:true
!undefined
true
(function () {})()
评论
!
!function
JavaScript 语法 101:下面是一个函数声明:
function foo() {}
请注意,没有分号;这只是一个函数声明。您需要调用 , 才能实际运行该函数。foo()
现在,当我们添加看似无害的感叹号时:它把它变成了一个表达。它现在是一个函数表达式。!function foo() {}
当然,单独调用函数不会,但我们现在可以将 : 放在末尾,它比 and 立即调用该函数具有更高的优先级。!
()
!function foo() {}()
!
function foo() {}()
将是一个语法错误,因为您不能将参数 () 放在函数声明之后。()
所以作者正在做的是为每个函数表达式保存一个字节;一种更具可读性的写作方式是这样的:
(function(){})();
最后,使表达式根据函数的返回值返回布尔值。通常,立即调用的函数表达式 (IIFE) 不会显式返回任何内容,因此它的返回值将是 ,这给我们留下了 .不使用此布尔值。!
undefined
!undefined
true
评论
var foo =
var foo = function(bar){}("baz");
感叹号使任何函数始终返回布尔值。
最后一个值是对函数返回的值的否定。
!function bool() { return false; }() // true
!function bool() { return true; }() // false
在上面的示例中省略将是一个 SyntaxError。!
function bool() { return true; }() // SyntaxError
但是,实现这一目标的更好方法是:
(function bool() { return true; })() // true
评论
!
()
!
Airbnb JavaScript指南上标记的函数调用是一个很好的点!
通常,在单独的文件(又名模块)上使用这种技术的想法,这些文件后来被连接起来。这里需要注意的是,文件应该由将新文件放在新行的工具连接起来(无论如何,这是大多数 concat 工具的常见行为)。在这种情况下,如果先前串联的模块错过了尾随分号,则使用将有助于避免错误,但这将提供灵活性,可以将它们按任何顺序排列,而无需担心。!
!function abc(){}();
!function bca(){}();
将工作与
!function abc(){}();
(function bca(){})();
但保存一个字符,任意看起来更好。
顺便说一句,,,,任何一个运算符在调用函数方面都具有相同的效果,当然,如果你必须使用某些东西从该函数返回,它们的行为会有所不同。+
-
~
void
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
但是,如果您使用 IIFE 模式进行一个文件一个模块代码分离并使用 concat 工具进行优化(这使得一行一个文件作业),那么构造
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
将执行安全的代码执行,与第一个代码示例相同。
这将引发错误,导致 JavaScript ASI 无法完成其工作。
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
关于一元运算符的注意事项,它们会做类似的工作,但只是为了以防万一,它们不在第一个模块中使用。因此,如果您不能完全控制串联顺序,它们就不是那么安全了。
这有效:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
这不是:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
评论
!
undefined
!是一个逻辑 NOT 运算符,它是一个布尔运算符,会将某物反转到它的对立面。
尽管您可以通过在函数前使用 BANG (!) 来绕过调用函数的括号,但它仍会反转返回值,这可能不是您想要的。与 IEFE 的情况一样,它将返回 undefined,当反转时变为布尔值真。
如果需要,请使用右括号和 BANG (!)。
// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.
(function(){ return false; }());
=> false
!(function(){ return false; }());
=> true
!!(function(){ return false; }());
=> false
!!!(function(){ return false; }());
=> true
其他工作的操作员...
+(function(){ return false; }());
=> 0
-(function(){ return false; }());
=> -0
~(function(){ return false; }());
=> -1
组合操作员...
+!(function(){ return false; }());
=> 1
-!(function(){ return false; }());
=> -1
!+(function(){ return false; }());
=> true
!-(function(){ return false; }());
=> true
~!(function(){ return false; }());
=> -2
~!!(function(){ return false; }());
=> -1
+~(function(){ return false; }());
+> -1
它是 IIFE(立即调用的函数表达式)的另一种编写方式。
它的另一种写作方式——
(function( args ) {})()
等同于
!function ( args ) {}();
评论
(function (args) {...})()
!function
这只是为了在我们进行 javascript 缩小时保存一个字节的数据。
考虑下面的匿名函数:
function (){}
为了使上述内容成为自调用函数,我们通常会将上面的代码更改为:
(function (){}())
现在我们添加了两个额外的字符:and,除了在函数末尾添加之外,这是调用它所必需的。在缩小过程中,我们通常专注于减小文件大小。所以我们也可以把上面的函数写成:(
)
()
!function (){}()
两者仍然是自调用函数,我们也节省了一个字节。我们没有使用2个字符,而是只使用了一个字符。(
)
!
评论
(function(){})()
下一个:将参数传递给 Bash 函数
评论
!(()=>{})();
!(function() {})();