其實以前雖然剛開始學習JavaScript的時候常常看到function add(){}、var add=function(){}、function(){}之類的這種寫法,可是具體是什麼叫什麼卻沒有去考慮過這個問題……函數
function add(){}這種寫法叫作函數聲明學習
var add=function(){}這種寫法叫作函數表達式spa
function(){}這種是匿名函數code
那麼有沒有辦法讓它們不用經過咱們的調用好比blog
function add(){}; add();
就能夠自我執行呢?token
咱們來試試看這三種方法ip
//函數表達式自執行嘗試 var add=function(x,y){ console.log(x+y); }(5,6); //結果:11(正確) ) //函數聲明自執行嘗試 function add(x,y){ console.log(x+y); }(5,6); //結果:沒法執行,也沒有拋出錯誤 //匿名函數自執行嘗試 function(){ console.log(arguments[0]+arguments[1]); }(5,6); //結果:這個的問題就大了,拋出語法錯誤Uncaught SyntaxError: Unexpected token (
函數表達式後面加括號能夠當即執行函數,然而函數聲明卻不能夠!!io
很奇怪地,匿名函數也是函數表達式,可是它爲何會拋出語法錯誤呢?這是由於匿名函數雖然屬於函數表達式,可是很明顯它沒有賦值操做,JavaScript解析引擎會把它當作函數聲明,會跟你要一個函數名,可是它是匿名函數,確定沒有名字,JavaScript混了,直接給你個錯誤讓你檢討一下。console
那要怎麼解決匿名函數自執行這個問題?其實很簡單,只要告訴JavaScript解析器匿名函數不是函數聲明就行了。function
//加號 +function(){ console.log(arguments[0]+arguments[1]); }(5,6); //減號 -function(){ console.log(arguments[0]+arguments[1]); }(5,6); //感嘆號 !function(){ console.log(arguments[0]+arguments[1]); }(5,6); //括號 (function(){ console.log(arguments[0]+arguments[1]); })(5,6); (function(){ console.log(arguments[0]+arguments[1]); }(5,6));
接下來就是解決函數聲明自執行的問題了,其實方法跟匿名函數自執行的方法是同樣的,加號,減號,感嘆號,括號,均可以解決
!function add(x,y){ console.log(x+y); }(5,6); +function add(x,y){ console.log(x+y); }(5,6); -function add(x,y){ console.log(x+y); }(5,6); (function add(x,y){ console.log(x+y); })(5,6); (function add(x,y){ console.log(x+y); }(5,6));
函數聲明纔會提高,函數表達式是屬於變量提高
咱們先來看一下下面這段代碼的結果是什麼
console.log(a); console.log(b); console.log(c); var a=1; function b(){ return 2; } var c=function(){ return 3; }
結果
console.log(c)的結果跟console.log(a)是同樣的,說明函數表達式是屬於變量提高的。這樣證實仍是有點草率,咱們再來看看下面的代碼
console.log(b()); console.log(c()); function b(){ return 2; } var c=function(){ return 3; }
結果
結果很明顯了,函數c只是提高了變量名c而已,函數聲明纔會提高!
那麼變量的提高和函數聲明的提高哪一個提高的優先級比較高呢?
console.log(b); console.log(b()); var b=1; function b(){ return 2; }
結果
結果顯示函數聲明提高的優先級比變量提高還要高。