学习es6的时候遇到了自执行函数,感觉有必要写下来,一方面加深自己的记忆,另一方面还能分享给大家。
什么是自执行函数?
自执行函数就是为了不污染全局变量命名空间的一中匿名函数,相当于自己创建了一个作用域,下面我来说一下它的原理:
function foo() {...} // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。
foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。
上面的函数就是传统的函数,它写起来有点啰嗦,而且会污染全局命名空间,这样对我们来说并不友好,所以自执行函数就出现了,写法如下:
(function foo() {...})();
(function foo() {...}());//推荐使用这种形式
上面的代码块就是自执行函数的两种形式,推荐使用下面的这种形式,具体好在哪我也不清楚,也许是因为包裹起来更像封装了一个函数,大家可以这么理解。传统的函数比如:function foo(...){} ,它其实是一种声明,对于解释器来说,就好像你写了一个字符串 "function foo(...){}",它需要使用解析函数,比如 eval() 来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。如何把它变得正确?说起来也简单,只要把 声明 变成 表达式(Expression) 就可以了。也就是上述代码块中的函数。
希望大家能理解,我也就不胜荣幸了。