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

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

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

相关文章
相关标签/搜索