关于javascript: !function(){}() 如何工作

How exactly does !function(){}() work?

本问题已经有最佳答案,请猛点这里访问。

我见过:

1
!function(){ //code }();

在多个地方用于立即执行匿名函数。通常,它被用来代替:

1
(function(){ //code }())

有人知道!是如何使函数执行的吗?


这是什么!做

当使用!时,函数将成为一元(逻辑)not运算符的单个操作数。

这将强制将函数作为表达式进行计算,从而允许立即以内联方式调用它。

其他替代方案

你可以用任何接线员来做这个。以下是一些例子…

1
2
3
4
5
'invoke',function(){ /*code*/ }();
1+function(){ /*code*/ }();
void function(){ /*code*/ }();
~function(){ /*code*/ }();
+function(){ /*code*/ }();

其中一些好处是,运算符的含义没有过载。

()的问题

在函数周围使用()时,如果一行中有多个bug而没有分号分隔,则可能会遇到一些bug。

1
2
3
4
5
6
7
8
9
10
(function() {
    alert('first');
}())


(function() {
    alert('second');
}())

// TypeError: undefined is not a function

这将导致一个TypeError,因为围绕第二个函数的一对外部()将被解释为打算调用一个函数。当然,第一个函数不返回函数,所以您尝试调用undefined

使用不同的运算符如何处理(或避免)问题

即使是像+这样的操作员,在某种程度上过载也不会导致错误。

如果你这样做…

1
2
3
4
5
6
7
+function() {
    alert('first');
}()

+function() {
    alert('second');
}()

第一个+被解释为一元+运算符,它转换从第一个函数返回的结果,在本例中是undefined,因此它被转换为NaN

第二个+将被解释为加法运算符,因此将尝试将NaN添加到第二个函数的返回结果中,这里再次是undefined

结果当然是NaN,但它是无害的。没有可以引发错误的非法代码。

演示操作员如何与函数交互

为了证明这一点,只需给每个函数一个返回值,然后将其粘贴到控制台中…

1
2
3
4
5
6
7
8
9
10
11
+function() {
    alert('first');
    return"10";
}()

+function() {
    alert('second');
    return 20;
}()

// 30

您将得到两个alert,然后控制台将显示30,因为第一个+操作符将字符串"10"转换为数字10,第二个+将两个结果相加。


!是一个普通的逻辑否定。()执行该函数。