javascriptの関数は第一級オブジェクトとして扱われています。 
 wikipediaから引用した第一級オブジェクトの性質は次の通りです。
言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。
無名のリテラルとして表現可能である。 変数に格納可能である。 データ構造に格納可能である。 それ自体が独自に存在できる(名前とは独立している)。 他のものとの等値性の比較が可能である。 プロシージャや関数のパラメータとして渡すことができる。 プロシージャや関数の戻り値として返すことができる。 実行時に構築可能である。 表示可能である。 読み込むことができる。 分散したプロセス間で転送することができる。 実行中のプロセスの外に保存することができる。 
 javascriptの関数は第一級オブジェクトです。プロシージャや関数の戻り値として返すことができます。
 このためjavascriptの関数の定義は似たような二種類の書き方が出来ます。一つはただ関数の宣言を行う処理が起きる書き方、もう一つは関数を変数に格納する処理が起きる書き方です。
function a(){console.log('hoge')}//関数の宣言のみを行う。変数aの中に名前aの関数が格納される。
a = function(){console.log('hoge')}//変数aの中に名無しの関数を格納する。
 それぞれ実行すると次の様になります。

 またES6で追加されたアロー関数を使うと次の様にも書けます。関数を定義した感じがあまりしません。この書き方が浸透したような場所でない限り、本来の目的通りコールバックに使うべきでしょう。
a = () => {console.log('hoge')}//変数aの中に名無しの関数を格納する。
本来の目的に沿った書き方は次の様な書き方です。
//イベント付与では元々コールバックとして関数式、関数オブジェクトを渡していた。引数無しならばこのように書ける
function console_log_hoge(){
    console.log('hoge')
}
$('p').on('click',console_log_hoge)
//アロー関数による引数渡しは短くわかりやすく書ける
//また$('p').on('click',console_log_innerText(e))とした場合,その場で関数が実行されてしまう
function console_log_innerText(e){
    console.log(e.target.innerText)
}
$('p').on('click',e => console_log_innerText(e))
最後にこんなこともできるがするべきではない書き方をひとつ。
function a(){
	return function b(){
		return console.log('c');
	}
}
a()()
           
					         
               
                      
 
						
						 
                