對(duì)于一個(gè)js匿名函數(shù)
function (){alert('message')}
自調(diào)用這個(gè)匿名函數(shù)
function (){alert('message')}
這樣解釋器會(huì)報(bào)錯(cuò)
為什么呢? 原因可以看一個(gè)普通js函數(shù)的調(diào)用
function a(){alert('message')} // undefined
這是一個(gè)函數(shù)聲明,如果在這么一個(gè)聲明后直接加上括號(hào)調(diào)用,解析器不能理解而會(huì)報(bào)錯(cuò):
function a(){alert('message')}() // SyntaxError: unexpected_token
而a函數(shù)申明時(shí)候,調(diào)用就可以直接加()
a() // undefined
這里可以看出無(wú)論是命名函數(shù)還是匿名函數(shù),都是函數(shù)申明,而直接對(duì)匿名函數(shù)加()之后,解釋器就不能理解而報(bào)錯(cuò)了
要自調(diào)用匿名函數(shù),就需要把匿名函數(shù)聲明語(yǔ)句變成一個(gè)表達(dá)式
!function(){alert('message')}() // true
+function(){alert('message')}() // NaN
-function(){alert('message')}() // NaN
~function(){alert('message')}() // -1
(function(){alert('message')})() // undefined
(function(){alert('message')}()) // undefined
以上都是通過(guò)一元運(yùn)算符或者括號(hào),這樣解釋器就可以知道,這不是函數(shù)申明,而是函數(shù)表達(dá)式.