究竟如何!function(){}()有效吗?

the*_*edz 14 javascript

我见过:

!function(){ //code }();
Run Code Online (Sandbox Code Playgroud)

用于几个地方立即执行匿名功能.通常,它用于代替:

(function(){ //code }())
Run Code Online (Sandbox Code Playgroud)

有谁知道!实际上如何执行该功能?

小智 39

什么了!不

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

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


其他选择

几乎任何操作员都可以这样做.这里有些例子...

'invoke',function(){ /*code*/ }();
1+function(){ /*code*/ }();
void function(){ /*code*/ }();
~function(){ /*code*/ }();
+function(){ /*code*/ }();
Run Code Online (Sandbox Code Playgroud)

关于其中一些的好处是运算符的含义不会过载.


这个问题 ()

当你()在函数周围使用时,你可以遇到一些错误,如果你连续多个没有用分号分隔它们就会突然出现.

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


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

// TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)

这将导致a TypeError,因为()第二个函数周围的外部对将被解释为打算调用函数.第一个当然没有返回功能,所以你试着打电话undefined.


如何使用不同的操作员来处理(或避免)问题

即使像+某种程度过载的操作员也不会导致错误.

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

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

+function() {
    alert('second');
}()
Run Code Online (Sandbox Code Playgroud)

第一个+被解释为一元+运算符,它转换从第一个函数返回的结果,在这种情况下undefined它被转换为NaN.

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

结果当然是NaN,但它是无害的.抛出错误没有非法代码.


演示操作员如何与功能交互

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

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

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

// 30
Run Code Online (Sandbox Code Playgroud)

您将获得两个alert,然后控制台将显示,30因为第一个+运算符将String "10"转换为Number 10,第二个+将两个结果一起添加.