最大的作用是创建一个独立的作用域
用IIFE(匿名函数立即执行)实现,针对不需要复用的功能模块可以用IIFE完全消除全局变量,所以一般IIFE都是用来辅助命名空间/模块化方式的
函数表达式后面加上括号可以立即调用该函数,但是函数声明不可以
例如:function a(){}后直接加()不能实现立即执行 function(){}()(错误);
但在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。
加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。
原因:
JavaScript引擎规定,如果function关键字出现在行首,一律解释成语句。因此,JavaScript引擎看到行首是function关键字之后,认为这一段都是函数的定义,不应该以圆括号结尾,所以就报错了。
意义:
目前看来最大的作用创建一个独立的作用域,隔离作用域,因为直到ES5为止JS里都只有函数作用域,没有局部作用域。那么要隔离作用域就只能把代码用一个函数框起来了,然后用所谓立即执行函数的方式。
补充:还有创建闭包函数