很久没写博客了,刚过完年,给你们拜个晚年,你们新年快乐!javascript
相信昨晚前端,不少同窗应该都见过相似于:html
1
2
|
!
function
() {
do
something...}()
~
function
(){
do
something...}()
|
等这样的匿名函数写法!前端
固然对于老同志来讲,确定是明白这样写法的做用了,可是对于新手来讲可能会有必定的困扰,这里就简单给你们分享一下关于这种写法的做用,以及原理!java
众所周知,在js中能够这样建立一个匿名函数:函数
1
2
3
|
(
function
(){
do
something...})()
//或
(
function
(){
do
something...}())
|
而匿名函数后面的小括号()是为了让匿名函数当即执行,其实就是一个函数调用,相信你们都懂的!post
那你们有没有想过为何这么写就会报错了:spa
1
|
function
(){alert(1)}()
|
其实很简单,由于function前面没有(或者! ~之类的运算符,js解析器会试图将关键字function解析成函数声明语句,而不是函数定义表达式!code
做为组运算符,小括号()会将其内部的表达式当成一个总体,而后返回结果,因此定义一个匿名函数正确的格式就是用小括号将函数体括起来!htm
一样的! ~ + -等运算符也有一样的效果,这是由于匿名函数也是一种值,这些运算符会将后面的函数体当成一个总体,先对匿名函数进行求值,而后在对结果进行运算!blog
不过这些运算符虽然可以达到让匿名函数当即执行的目的,可是要当心他们是有反作用的,好比:
1
2
3
4
|
!
function
() {
return
1}()
//false
~
function
() {
return
1}()
//-2
-
function
() {
return
false
}()
//0
-
function
() {
return
false
}()
//0
|
没错,他们会对函数的返回值进行运算,这样可能会致使最终的结果和你想要的结果不同!固然,对于那些没有返回值的函数来讲,固然是没有什么影响了!
既然上面都说了可能会有反作用,那为何还有这么多人用了?
其实答案很简单,无外乎两点:
1.让代码看起来不容易懂,说白了就是装~比~
2.少写一个),偷懒呗!
固然通常这么用的时候都是函数自己没有返回值的状况!(还有可能会有一些特殊的需求啦),为了代码可读性,本人建议仍是按照正规的方式使用匿名函数,没有特殊需求的状况下尽可能不用这些运算符代替小括号!