功能前的感叹号有什么作用?

2020/09/17 21:01 · javascript ·  · 0评论
!function () {}();

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

function foo() {}

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

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

!单独不会调用函数,当然,但我们现在可以把()结尾:!function foo() {}()它的优先级高于!并立即调用函数。

因此,作者要做的是为每个函数表达式节省一个字节。更具可读性的书写方式是:

(function(){})();

最后,!使表达式返回true。这是因为在默认情况下所有IIFE回报undefined,这给我们留下了!undefined这是true不是特别有用。

功能:

function () {}

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

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

function () {}()

但结果是SyntaxError

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

!function () {}()

在这种情况下true,由于!undefinedis ,这也将返回与函数返回值相反的布尔值true如果您希望实际的返回值是调用的结果,请尝试以这种方式进行操作:

(function () {})()

!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*/}()

它返回该语句是否可以评估为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

当我们进行JavaScript压缩时,它只是为了保存数据字节。

考虑下面的匿名函数

function (){}

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

(function (){}())

现在,(,)除了()在函数末尾添加调用函数所需的字符之外,我们还添加了两个额外的字符在缩小过程中,我们通常着重于减小文件大小。所以我们也可以将上面的函数写为

!function (){}()

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

感叹号使任何函数始终返回布尔值。

最终值是该函数返回的值的取反。

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

!在上面的示例中将省略SyntaxError

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

但是,实现此目的的更好方法是:

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

是一个逻辑运算符,它是一个布尔运算符,它将把某些东西反过来。

尽管您可以在函数前使用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

这是编写IIFE(立即调用函数表达式)的另一种方式。

另一种写作方式-

(function( args ) {})()

和...一样

!function ( args ) {}();

! 将否定(相反)结果的期望值,即如果您有

var boy = true;
undefined
boy
true
!boy
false

当您打电话时boy,您的结果将是true,但是当您添加!通话时的那一刻boy,即!boy您的结果将是false其中换句话说,你的意思是NotBoy,但这次它基本上是一个布尔结果,无论是truefalse

这与!function () {}();表达式发生的事情相同,只运行function () {}();将标记您一个错误,但是!function () {}();表达式前面添加,使其与function () {}();应该返回您的表达式相反true示例如下所示:

function () {}();
SyntaxError: function statement requires a name
!function () {}();
true
本文地址:http://javascript.askforanswer.com/gongnengqiandegantanhaoyoushenmezuoyong.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!