函數的兩種定義方法:
函數聲明
function fn1(){
console.log('函數聲明');
}
函數表達式
var fn2 = function(){
console.log('函數表達式');
};
函數包括四個部分,function關鍵字、函數名、圓括號、花括號。
期中函數名稱可以省略 ,此時函數被稱為匿名函數
當這種寫法出現在表達式,又稱為函數 表達式
函數可以出現在任何允許表達式出現的地方 ---《javaScript語言精粹》
這兩種定義函數的方法有什么區別呢?看看以下的對比:
//函數調用放置在聲明函數之前,函數能夠被正常調用
fn1()
function fn1(){
console.log('函數聲明')
} //函數聲明
//函數調用放置在函數表達式之前,結果出現報警
fn1()
var fn1 = function(){
console.log('函數表達式')
} //Uncaught TypeError: fn1 is not a function(…)
根據JavaScript的解析方式,先掃描一遍整個js部分,將函數聲明提升至最前方(函數聲明是一等公民),而函數表達式則只有在解析到其所在位置時才會被解析
根據這個情況,函數聲明實際上實在其函數調用前解析的,所以它能夠被正常調用
再看看下面的對比:
//函數聲明后跟一對圓括號無法調用
function fn1(){
console.log('函數聲明')
}() //Uncaught SyntaxError: Unexpected token ((…)
//函數表達式后跟一對圓括號可以立即調用
var fn1 = function(){
console.log('函數表達式')
}() //函數表達式
由以上對比可以知道,函數以表達式情況出現時,可以以后面加一對圓括號的方式立即調用
所以我們常見的這種立即調用的方法,實際上可以看成將匿名函數轉換成了函數表達式,隨后立即調用
//以下是調試臺的調試結果,利用這些運算符可以將函數轉換成表達式形式
//這些可以實現立即調用,而剩余符號會導致報錯
//不過其余的運算符會出現將函數返回值進行運算的情況,所以常用括號
(function(){console.log('OK')})()
//OK
//undefined
+function(){console.log('OK')}()
//OK
//NaN
-function(){console.log('OK')}()
//OK
//NaN
~function(){console.log('OK')}()
//OK
//-1
!function(){console.log('OK')}()
//OK
//true