!function () {}();

当前回答

! 是一个逻辑NOT运算符,它是一个布尔运算符,可以将某个值反转为相反的值。

尽管可以通过在函数之前使用BANG(!)来绕过被调用函数的括号,但它仍然会反转返回,这可能不是您想要的。与IEFE的情况一样,它将返回undefined,当反转时,它将变为布尔值true。

如果需要,请使用右括号和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

其他回答

感叹号使任何函数始终返回布尔值。最后一个值是函数返回值的否定值。

!function bool() { return false; }() // true
!function bool() { return true; }() // false

省略!在上述示例中,将是SyntaxError。

function bool() { return true; }() // SyntaxError

然而,实现这一目标的更好方法是:

(function bool() { return true; })() // true

! 是一个逻辑NOT运算符,它是一个布尔运算符,可以将某个值反转为相反的值。

尽管可以通过在函数之前使用BANG(!)来绕过被调用函数的括号,但它仍然会反转返回,这可能不是您想要的。与IEFE的情况一样,它将返回undefined,当反转时,它将变为布尔值true。

如果需要,请使用右括号和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

JavaScript语法101:这里是一个函数声明:

function foo() {}

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

现在,当我们添加看似无害的感叹号时:!函数foo(){}将其转换为表达式。现在它是一个函数表达式。

这个当然,单独使用不会调用函数,但我们现在可以将()放在末尾:!函数foo(){}(),其优先级高于!并立即调用该函数。

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

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

(function(){})();

最后一点根据函数的返回值使表达式返回布尔值。通常,立即调用的函数表达式(IIFE)不会显式返回任何内容,因此它的返回值将是未定义的,这就给我们留下了!undefined,这是真的。未使用此布尔值。

功能:

function () {}

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

有时我们希望在创建函数时立即调用它。您可能会尝试这样做:

function () {}()

但它会导致SyntaxError。

使用!运算符,使其被视为表达式,因此我们可以调用它:

!function () {}()

这还将返回与函数返回值相反的布尔值,在本例中为true,因为!undefined为true。如果您希望实际的返回值是调用的结果,请尝试这样做:

(function () {})()

当我们进行javascript缩小时,这只是为了保存一个字节的数据。

考虑下面的匿名函数:

    function (){}

为了使上述函数成为自调用函数,我们通常会将上述代码更改为:

    (function (){}())

现在我们添加了两个额外的字符:(和),除了在函数末尾添加()之外,这是调用它所必需的。在缩小过程中,我们通常专注于减小文件大小。因此,我们也可以将上述函数写成:

    !function (){}()

两者仍然是自调用函数,我们也保存了一个字节。我们只使用了一个字符!。