其實之前雖然剛開始學習JavaScript的時候經常看到function add(){}、var add=function(){}、function(){}之類的這種寫法,但是具體是什麼叫什麼卻沒有去考慮過這個問題…… function add(){}這種寫法叫做函數聲明 var add=funct ...
其實之前雖然剛開始學習JavaScript的時候經常看到function add(){}、var add=function(){}、function(){}之類的這種寫法,但是具體是什麼叫什麼卻沒有去考慮過這個問題……
function add(){}這種寫法叫做函數聲明
var add=function(){}這種寫法叫做函數表達式
function(){}這種是匿名函數
一、函數的自執行
那麼有沒有辦法讓它們不用通過我們的調用比如
function add(){}; add();
就可以自我執行呢?
我們來試試看這三種方法
//函數表達式自執行嘗試 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 (
函數表達式後面加括弧可以立即執行函數,然而函數聲明卻不可以!!
很奇怪地,匿名函數也是函數表達式,但是它為什麼會拋出語法錯誤呢?這是因為匿名函數雖然屬於函數表達式,但是很明顯它沒有賦值操作,JavaScript解析引擎會把它當做函數聲明,會跟你要一個函數名,但是它是匿名函數,肯定沒有名字,JavaScript混了,直接給你個錯誤讓你反省一下。
那要怎麼解決匿名函數自執行這個問題?其實很簡單,只要告訴JavaScript解析器匿名函數不是函數聲明就好了。
//加號 +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; }
結果
結果顯示函數聲明提升的優先順序比變數提升還要高。