除了用function
命令声明函数,还能够采用变量赋值的写法。javascript
这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),由于赋值语句的等号右侧只能放表达式。java
采用函数表达式声明函数时,function
命令后面不带有函数名。若是加上函数名,该函数名只在函数体内部有效,在函数体外部无效。浏览器
上面代码在函数表达式中,加入了函数名x
。这个x
只在函数体内部可用,指代函数表达式自己,其余地方都不可用。函数
这种写法的用处有两个:工具
1 .是能够在函数体内部调用自身;google
2 .是方便除错(除错工具显示函数调用栈时,将显示函数名,而再也不显示这里是一个匿名函数spa
所以,下面的形式声明函数也很是常见。3d
须要注意的是,函数的表达式须要在语句的结尾加上分号,表示语句结束。code
demo1blog
在Javascript中,一对圆括号()
是一种运算符,跟在函数名以后,表示调用该函数。好比,print()
就表示调用print
函数。
有时,咱们须要在定义函数以后,当即调用该函数。这时,你不能在函数的定义以后加上圆括号,这会产生语法错误。
产生这个错误的缘由是,function
这个关键字便可以看成语句,也能够看成表达式。
为了不解析上的歧义,JavaScript引擎规定,若是function
关键字出如今行首,一概解释成语句。所以,
JavaScript引擎看到行首是function
关键字以后,认为这一段都是函数的定义,不该该以圆括号结尾,因此就报错了。
解决方法就是不要让function
出如今行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。
上面两种写法都是以圆括号开头,引擎就会认为后面跟的是一个表示式,而不是函数定义语句,因此就避免了错误。
这就叫作“当即调用的函数表达式”(Immediately-Invoked Function Expression),简称IIFE。
注意,上面两种写法最后的分号都是必须的。若是省略分号,遇到连着两个IIFE,可能就会报错。
在google浏览器下,显示错误以下:
上面代码的两行之间没有分号,JavaScript会将它们连在一块儿解释,将第二行解释为第一行的参数。
推而广之,任何让解释器以表达式来处理函数定义的方法,都能产生一样的效果,好比下面三种写法。