匿名函数function前面的! ~等符号做用小解

 [转自]:http://www.cnblogs.com/xjser/p/5210697.html

 

很久没写博客了,刚过完年,给你们拜个晚年,你们新年快乐!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.少写一个),偷懒呗!

固然通常这么用的时候都是函数自己没有返回值的状况!(还有可能会有一些特殊的需求啦),为了代码可读性,本人建议仍是按照正规的方式使用匿名函数,没有特殊需求的状况下尽可能不用这些运算符代替小括号!

相关文章
相关标签/搜索