使用建议:

在使用只执行函数前面加上 “ ; ”,避免压缩或者打包时变为函数。

我们要了解,为什么使用自执行函数,确切的说是自执行函数的优点以及缺点:

1.避免作用域命名污染

2.提升性能(减少了对作用域的查找)

3.避免全局命名冲突

比如jq里面暴露给全局作用域$和query两个变量,为了解决这个问题,我们可以将window.jq作为一个实参传递给一个立即执行的匿名函数。这样的话,我们再次命名$或者query就不会有冲突了。

4.有利于代码压缩(可以用简单字符串代替)

5.保存闭包状态

6.颠倒代码执行顺序

    (function(){})(bb())
    console.log(12)
    functionbb(){
        console.log(22)
    };//打印顺序是22,12
这就叫做UMD通用模块规范,在实际开发过程中被广泛应用。

7.模仿块级作用域

作用域的内部可以访问到外部,外部不可以访问到内部,js作用域的缺陷就是没有块级作用域。
    for(vari=0;i<6;i++){
    }
    console.log(i);//打印出来的是6,在for循环外面仍然可以访问到变量i。
匿名自执行函数只能模拟块级作用域,并非真正的作用域。

8.填坑(加载第三方插件时候的一些问题)

比如有个人写了这样一段代码:undefined=true,再早之前undefined是可以被赋值的,所以这段代码不会报错,但是这样会致使你下面的一些判断出错
这时候如果使用匿名自执行函数就可以解决:
    (function(undefined){
        console.log(undefined)
    }())

自执行函数的写法

方法1:

    (function(a){
        console.log(a);  //2
    })(2);

方法2:

    (function(){
        console.log(2)
    }() );

方法3(通过操作符):但是这种方法仍然会占用命名空间,所以不建议使用。

    var a = function (){
        console.log(2)
    }()

方法4(通过操作符)与或操作符:

    false || function (){
        console.log(2)
    }()
    true && function (){
        console.log(2)
    }()
    0 , function (){
        console.log(2)
    }()
注:通过操作符实现自执行函数一般使用在打包工具里面,比如webpack打包后会经常看到 ' 0,functtion(){}()'

0px;">方法5:(一元运算符)一元运算符仍然可以将函数声明转换为函数表达式,在bootstrap框架中常用。

    ! function (){
        console.log(2)
    }()
    -function (){
        console.log(2)
    }()
    +function (){
        console.log(2)
    }()

方法6:new一个匿名函数,后面可省略括号。(不建议使用,会产生争议)

    new function (){
        console.log(2)
    };//在不传参的情况下使用new也可以自执行,可以去掉小括号,不常用。

以上方法性能比较:

除了一元运算符的时候性能偏低,因为要进行一次数字类型的转换,其他的都可以。

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。