!function()() 究竟是如何工作的? [复制]

Posted

技术标签:

【中文标题】!function()() 究竟是如何工作的? [复制]【英文标题】:How exactly does !function()() work? [duplicate]!function()() 究竟是如何工作的? [复制] 【发布时间】:2012-01-26 13:21:18 【问题描述】:

我见过:

!function() //code ();

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

(function() //code ())

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

【问题讨论】:

值得指出的是,虽然前者有效,但它确实否定了函数返回的值,而第二种形式则没有。 【参考方案1】:

什么!会

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

这会强制将函数作为表达式求值,从而允许立即内联调用它。


其他选择

您几乎可以使用任何运算符来执行此操作。这里有一些例子......

'invoke',function() /*code*/ ();
1+function() /*code*/ ();
void function() /*code*/ ();
~function() /*code*/ ();
+function() /*code*/ ();

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


()的问题

当您在函数周围使用() 时,您可能会遇到一些错误,如果您连续有多个没有用分号分隔它们的错误。

(function() 
    alert('first');
())


(function() 
    alert('second');
())

// TypeError: undefined is not a function

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


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

即使像+ 这样的运算符在某种程度上过载也不会导致错误。

如果你这样做......

+function() 
    alert('first');
()

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

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

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

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


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

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

+function() 
    alert('first');
    return "10";
()

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

// 30

您将获得两个alerts,然后控制台将显示30,因为第一个+ 运算符将字符串"10" 转换为数字10,并添加了第二个+两个结果一起。

【讨论】:

绝妙的答案!你有我的 +1。 +1 很好的答案和非常有趣的信息。【参考方案2】:

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

【讨论】:

我认为 OP 是在问为什么简单地将 ! 前置到 function() //code () (否则是一个错误)会导致匿名函数被执行。

以上是关于!function()() 究竟是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

尾递归究竟是如何工作的?

泛型究竟是如何工作的?

这个 Promise 示例究竟是如何工作的?

Spring BeanPostProcessor 究竟是如何工作的?

Django 内容类型究竟是如何工作的?

bufferedReader() 在 Kotlin 中究竟是如何工作的?