函數(shù)的兩種定義方法:
函數(shù)聲明
function fn1(){
console.log('函數(shù)聲明');
}
函數(shù)表達式
var fn2 = function(){
console.log('函數(shù)表達式')璃氢;
};
函數(shù)包括四個部分哟玷,function關鍵字、函數(shù)名一也、圓括號巢寡、花括號。
期中函數(shù)名稱可以省略 椰苟,此時函數(shù)被稱為匿名函數(shù)
當這種寫法出現(xiàn)在表達式抑月,又稱為函數(shù) 表達式
函數(shù)可以出現(xiàn)在任何允許表達式出現(xiàn)的地方 ---《javaScript語言精粹》
這兩種定義函數(shù)的方法有什么區(qū)別呢?看看以下的對比:
//函數(shù)調用放置在聲明函數(shù)之前舆蝴,函數(shù)能夠被正常調用
fn1()
function fn1(){
console.log('函數(shù)聲明')
} //函數(shù)聲明
//函數(shù)調用放置在函數(shù)表達式之前谦絮,結果出現(xiàn)報警
fn1()
var fn1 = function(){
console.log('函數(shù)表達式')
} //Uncaught TypeError: fn1 is not a function(…)
根據JavaScript的解析方式,先掃描一遍整個js部分洁仗,將函數(shù)聲明提升至最前方(函數(shù)聲明是一等公民)挨稿,而函數(shù)表達式則只有在解析到其所在位置時才會被解析
根據這個情況,函數(shù)聲明實際上實在其函數(shù)調用前解析的京痢,所以它能夠被正常調用
再看看下面的對比:
//函數(shù)聲明后跟一對圓括號無法調用
function fn1(){
console.log('函數(shù)聲明')
}() //Uncaught SyntaxError: Unexpected token ((…)
//函數(shù)表達式后跟一對圓括號可以立即調用
var fn1 = function(){
console.log('函數(shù)表達式')
}() //函數(shù)表達式
由以上對比可以知道,函數(shù)以表達式情況出現(xiàn)時篷店,可以以后面加一對圓括號的方式立即調用
所以我們常見的這種立即調用的方法祭椰,實際上可以看成將匿名函數(shù)轉換成了函數(shù)表達式,隨后立即調用
//以下是調試臺的調試結果疲陕,利用這些運算符可以將函數(shù)轉換成表達式形式
//這些可以實現(xiàn)立即調用胯努,而剩余符號會導致報錯
//不過其余的運算符會出現(xiàn)將函數(shù)返回值進行運算的情況无埃,所以常用括號
(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