!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
您将获得两个alert
s,然后控制台将显示30
,因为第一个+
运算符将字符串"10"
转换为数字10
,并添加了第二个+
两个结果一起。
【讨论】:
绝妙的答案!你有我的 +1。 +1 很好的答案和非常有趣的信息。【参考方案2】:!
是一个普通的逻辑否定。()
执行函数。
【讨论】:
我认为 OP 是在问为什么简单地将!
前置到 function() //code ()
(否则是一个错误)会导致匿名函数被执行。以上是关于!function()() 究竟是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章