EchoCow

念念不忘,必有回响

目录
JavaScript 自执行匿名函数
/  

JavaScript 自执行匿名函数 有更新!

今天研究 rem 自适应解决方案的时候,发现在使用函数时,在 function 前面加了一个 !

同时后面还多了一个(),而且还是一个匿名函数,我们定义的匿名函数的时候一般如下:

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

这个是一个匿名函数,要想让它正常运行就必须给个函数名,然后通过函数名调用。而在匿名函数前面加上这些符号后,就把一个函数声明语句变成了一个函数表达式,是表达式就会在script标签中自动执行。

在定义匿名函数后,也就作为了一个函数名,然后后面加了(),表示这个函数执行。

也就是说,将函数内内容作为了一个整体,而我们调用函数的时候是函数名+(),例如fun(),这就表示调用一个fun函数,而此时将匿名函数替换了fun而已。

这样是一个函数声明
function a(){
    alert('IIFE');
}
这样是一个函数调用
a();
理解一下就是在一个声明了的函数后面加上一个()就可以调用函数了
function a(){
    alert('IIFE');
}()

但是,这样使用,这样的代码混淆了函数声明和函数调用,以这种方式声明的函数 a,就应该以 a(); 的方式调用。但是括号则不同,它将一个函数声明转化成了一个表达式,解析器不再以函数声明的方式处理函数a,而是作为一个函数表达式处理,也因此只有在程序执行到函数a时它才能被访问。**所以,任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。**所以,赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的。所以也可以改写成下面几种方式

!function(){alert('iifksp')}()        // true
+function(){alert('iifksp')}()        // NaN
-function(){alert('iifksp')}()        // NaN
~function(){alert('iifksp')}()        // -1
念念不忘,必有回响。
评论