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